Map双列集合
特点
1、双列集合一次需要存一对数据,分别为键(key)和值(value)
2、键不能重复,值可以重复
3、键和值是一一对应的,每一个键只能找到自己对应的值
4、键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”
常见API
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
Map<String ,String> m = new HashMap<>();
m.put("郭靖","黄蓉"); m.put("韦小宝","木健平");
String value = m.put("韦小宝","双儿"); System.out.println(value);
|
遍历方式
方式一:键找值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
Map<String ,String> m = new HashMap<>();
m.put("郭靖","黄蓉"); m.put("韦小宝","木健平"); m.put("欧阳克","黄蓉");
Set<String> keys = map.keySet();
for(String key : keys) { String value = map.get(key); System.out.println(key + "=" + value); }
|
方式二:键值对遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
Set<Map.Entry<String, String>> entries = map.entrySet();
for(Map.Entry<String, String> entry : entries){ String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "=" + value); }
|
方式三:lambda表达式
1 2 3 4 5
|
map.forEach((key, value) -> System.out.println(key + "=" + value));
|
HashMap
特点
1、HashMap是Map里面的一个实现类。
2、没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
3、特点都是由键决定的:无序、不重复、无索引,跟值没有任何关系
4、HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,详细请看《HashSet、LinkedHashSet底层》
HashMap底层是哈希表结构的 依赖hashCode方法和equals方法保证键的唯一
*如果键存储的是自定义对象,需要重写hashCode和equals方法
如果值存储自定义对象,不需要重写hashCode和equals方法
LinkedHashMap
特点
1、由键决定:有序、不重复、无索引
2、这里的有序指的是保证存储和取出的元素顺序一致
3、原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
TreeMap
特点
·TreeMap跟TreeSet底层原理一样,都是红黑树结构的
·由键决定特性:不重复、无索引、可排序
·可排序:对键进行排序。
·注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则
*代码书写两种排序规则
·实现Comparable接口,只当比较规则
·创建集合时传递Comparator比较器对象,指定比较规则(两种存在时第二种优先)
小练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
String s = "aababcabcdabcde";
TreeMap<Character, Integer> tm = new TreeMap<>();
for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); if(tm.containsKey(c)){ int count = tm.get(c); count++; tm.put(c,count); }else { tm.put(c,1); } }
StringBuilder sb =new StringBuilder();
tm.forEach((key, value) -> sb.append(key).append("(").append(value).append(")"));
|