欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaSE Map集合

程序员文章站 2022-03-30 21:52:18
Map集合 在Map集合中保存的数据为一组数据,其中:一个数据为key,另外一个数据为value。而key和value具备对应的关系,在集合中它们属于一组(一对)数据。而每个key只能对应唯一的一个value值并且所有的key不能重复。 但是其中的value值是可以重复的。 Collection中的 ......

map集合

在map集合中保存的数据为一组数据,其中:一个数据为key,另外一个数据为value。而key和value具备对应的关系,在集合中它们属于一组(一对)数据。而每个key只能对应唯一的一个value值并且所有的key不能重复。 但是其中的value值是可以重复的。

  • collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

  • map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

  • collection中的集合称为单列集合,map中的集合称为双列集合。

  • 需要注意的是,map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

通过查看map接口描述,看到map有多个子类,这里我们主要讲解常用的两个集合:

​ hashmap集合

​ linkedhashmap集合。

  • hashmap<k,v>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,因此需要重写键的hashcode()方法、equals()方法。

  • linkedhashmap<k,v>:存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashcode()方法、equals()方法。

map接口中定义了很多方法,常用的如下:

  • public v put(k key, v value): 把指定的键与指定的值添加到map集合中。如果键值存在则覆盖。

  • public v remove(object key): 把指定的键和对应的值在集合中删除,返回被删除元素的值。

  • public v get(object key) 根据指定的键,在map集合中获取对应的值。

map接口的方法演示

 1 public class mapdemo {
 2     public static void main(string[] args) {
 3         //创建 map对象
 4         hashmap<string, string>  map = new hashmap<string, string>();
 5 
 6         //添加元素到集合
 7         map.put("黄晓明", "杨颖");
 8         map.put("文章", "马伊琍");
 9         map.put("邓超", "孙俪");
10         system.out.println(map);
11 
12         //string remove(string key)
13         system.out.println(map.remove("邓超"));
14         system.out.println(map);
15 
16         // 想要查看 黄晓明的媳妇 是谁
17         system.out.println(map.get("黄晓明"));
18         system.out.println(map.get("邓超"));    
19     }
20 }

键找值方式

public set<k> keyset(): 获取map集合中所有的键,存储到set集合中。

 1 public class mapdemo01 {
 2     public static void main(string[] args) {
 3         //创建map集合对象 
 4         hashmap<string, string> map = new hashmap<string,string>();
 5         //添加元素到集合 
 6         map.put("胡歌", "霍建华");
 7         map.put("郭德纲", "于谦");
 8         map.put("薛之谦", "大张伟");
 9 
10         //获取所有的键  获取键集
11         set<string> keys = map.keyset();
12         // 遍历键集 得到 每一个键
13         for (string key : keys) {
14               //key  就是键
15             //获取对应值
16             string value = map.get(key);
17             system.out.println(key+"的cp是:"+value);
18         }  
19     }
20 }

entry键值对对象

public set<map.entry<k,v>> entryset(): 获取集合中所有的键值对对象,保存到set集合中。

我们已经知道,map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在map中是一一对应关系,这一对对象又称做map中的一个entry(项)entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历map集合时,就可以从每一个键值对(entry)对象中获取对应的键与对应的值。

既然entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:

  • public k getkey():获取entry对象中的键。

  • public v getvalue():获取entry对象中的值。

 1 public class mapdemo02 {
 2     public static void main(string[] args) {
 3         // 创建map集合对象 
 4         hashmap<string, string> map = new hashmap<string,string>();
 5         // 添加元素到集合 
 6         map.put("胡歌", "霍建华");
 7         map.put("郭德纲", "于谦");
 8         map.put("薛之谦", "大张伟");
 9 
10         // 获取 所有的 entry对象  entryset
11         set<entry<string,string>> entryset = map.entryset();
12 
13         // 遍历得到每一个entry对象
14         for ( entry<string, string> entry : entryset) {
15                // 解析 
16             string key = entry.getkey();
17             string value = entry.getvalue();  
18             system.out.println(key+"的cp是:"+value);
19         }
20     }
21 }

 

linkedhashmap

在hashmap下面有一个子类linkedhashmap,它是链表和哈希表组合的一个数据存储结构。在保证key值对象唯一的前提下,还能保证元素的存取顺序。

 1 public class linkedhashmapdemo {
 2     public static void main(string[] args) {
 3         linkedhashmap<string, string> map = new linkedhashmap<string, string>();
 4         map.put("邓超", "孙俪");
 5         map.put("李晨", "范冰冰");
 6         map.put("刘德华", "朱丽倩");
 7         set<entry<string, string>> entryset = map.entryset();
 8         for (entry<string, string> entry : entryset) {
 9             system.out.println(entry.getkey() + "  " + entry.getvalue());
10         }
11     }
12 }

map集合练习

需求:

  计算一个字符串中每个字符出现次数。

分析:

  1. 获取一个字符串对象

  2. 创建一个map集合,键代表字符,值代表次数。

  3. 遍历字符串得到每个字符。

  4. 判断map中是否有该键。

  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。

  6. 打印最终结果

 1 public class maptest {
 2 public static void main(string[] args) {
 3         //友情提示
 4         system.out.println("请录入一个字符串:");
 5         string line = new scanner(system.in).nextline();
 6         // 定义 每个字符出现次数的方法
 7         findchar(line);
 8     }
 9     public static void findchar(string line) {
10         //1:创建一个集合 存储  字符 以及其出现的次数
11         hashmap<character, integer> map = new hashmap<character, integer>();
12         //2:遍历字符串
13         for (int i = 0; i < line.length(); i++) {
14             char c = line.charat(i);
15             //判断 该字符 是否在键集中
16             if (!map.containskey(c)) {//说明这个字符没有出现过
17                 //那就是第一次
18                 map.put(c, 1);
19             } else {
20                 //先获取之前的次数
21                 integer count = map.get(c);
22                 //count++;
23                 //再次存入  更新
24                 map.put(c, ++count);
25             }
26         }
27         system.out.println(map);
28     }
29 }

排序集合treemap了解

如果保存到map集合中的key值数据需要排序,则可以使用treemap集合。集合内部会自动完成key值对象的排序动作。如果想自定义排序方式,可以在创建集合对象时传递一个比价器对象。

  treemap():使用自然顺序对key值进行排序。

  treemap(comparator comparator):创建对象时,传递比较器对象。按比较器的比较方式排序。

 1 public class demo {
 2     public static void main(string[] args) {
 3         // 创建集合对象,key值按照自然顺序排序
 4         treemap<string, string> map1 = new treemap<>();
 5         // 给集合中保存元素
 6         map1.put( "affd", "123" );
 7         map1.put( "fff", "456" );
 8         map1.put( "abc", "789" );
 9         system.out.println( "map1 = " + map1);
10 
11         // 创建集合对象,并传递比较器,按照指定的方式比较
12         treemap<string, string> map2 = new treemap<>(new comparator<string>() {
13             public int compare(string o1, string o2) {
14                 // 按照长度比较 , 相同长度不保存
15                 return o1.length() - o2.length();
16             }
17         });
18         // 给集合中保存元素
19         map2.put( "affd", "123" );
20         map2.put( "fff", "456" );
21         map2.put( "abc", "789" );
22         system.out.println( "map2 = " + map2 );
23     }
24 }