当前位置: 移动技术网 > IT编程>开发语言>Java > JavaSE Map集合

JavaSE Map集合

2019年04月15日  | 移动技术网IT编程  | 我要评论

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 }

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网