Map
特点:
- 双列集合一次要存储一对数据,分别为键和值
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键只能找到自己对应的值
- 键+值的整体,称之为“键值对”或者“键值对对象”,在java中叫做“Entry对象”
Map方法
1
| Map<T, T> m = new HashMap<> ();
|
1 2 3 4 5
| Map<T, T> m = new HashMap<> ();
m.put(t1, t2);
|
- 获取一个键对应的值,如果键不存在于Map中,则返回一个默认值(Java 8)
1 2 3 4
|
int value = m.getOrDefault(t3, 0);
|
- 将键与一个值合并到Map中,如果键已经存在,则根据提供的合并函数来更新该键的值
1 2 3 4 5 6 7 8 9 10 11 12
|
Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2);
map.merge("c", 3, Integer::sum); map.merge("a", 10, Integer::sum);
|
- 计算键的值,如果键不存在于Map中,则使用提供的映射函数来计算其值,并将其插入到Map中
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2);
map.computeIfAbsent("c", k -> k.length()); map.computeIfAbsent("a", k -> k.length());
System.out.println(map);
|
遍历方法
键找值
将键找出来单独放到单列集合中,通过遍历键来得到值
1 2 3 4 5 6 7
| Map<T, T> map = new HashMap<> (); Set<T> keys = map.keySet(); Iterator<T> iterator = keys.iterator(); while (iterator.hasNext()) { T key = iterator.next(); T value = map.get(key); }
|
1 2 3 4 5
| Map<T, T> map = new HashMap<> (); Set<T> keys = map.keySet(); for (T key : keys) { T value = map.get(key); }
|
1 2 3 4 5 6
| Map<T, T> map = new HashMap<> (); Set<T> keys = map.keySet(); keys.forEach(key -> { T value = map.get(key); System.out.println(value); });
|
键值对
1 2 3 4 5 6 7 8
| Map<T, T> map = new HashMap<> (); Set<Map.Entry<T, T>> entries = map.entrySet(); Iterator<Map.Entry<T, T>> iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry<T,T> entry = iterator.next(); T key = entry.getKey(); T value = entry.getValue(); }
|
1 2 3 4 5 6
| Map<T, T> map = new HashMap<> (); Set<Map.Entry<T, T>> entries = map.entrySet(); for (Map.Entry<T, T> entry : entries) { T key = entry.getKey(); T value = entry.getValue(); }
|
1 2 3 4 5 6
| Map<T, T> map = new HashMap<> (); Set<Map.Entry<T, T>> entries = map.entrySet(); entries.forEach(entry -> { T key = entry.getKey(); T value = entry.getValue(); });
|
lambda表达式
1 2 3 4
| Map<T, T> map = new HashMap<> (); map.forEach((T key, T value) -> { System.out.println(key + "=" + value); });
|
HashMap
- HashMap底层是哈希表结构
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键存储的是自定义对象,需要重写hashCode和equals方法,如果值是自定义对象,则不需要
LinkedHashMap
- LinkedHashMap底层依旧是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序
- 保证了存储和取出的顺序一致
TreeMap
- TreeMap的底层原理和TreeSet一样,都是红黑树结构
- 输出时会将键默认按照升序排列(可以通过实现Comparable接口或者创建对象时传递Comparator比较器对象来指定比较规则)
例:如何想要按照降序排列,可以在创建对象的时候传递比较器Comparator对象
1 2 3 4 5 6
| TreeMap<Integer, String> tm = new TreeMap<> (new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } });
|