jdk1.8.0_144
Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap、TreeMap、SortedMap等等,这些最终的子类大多有一个共同的抽象父类AbstractMap。在AbstractMap中实现了大多数Map实现公共的方法。本文介绍Map接口定义了哪些方法,同时JDK8又新增了哪些。
Map翻译为“映射”,它如同字典一样,给定一个key值,就能直接定位value值,它的存储结构为“key : value"形式,核心数据结构在Map内部定义了一个接口——Entry,这个数据结构包含了一个key和它对应的value。首先来窥探Map.Entry接口定义了哪些方法。
interface Map.Entry<K, V>
K getKey()
获取key值。
V getValue()
获取value值。
V setValue(V value)
存储value值。
boolean equals(Object o)
int hashCode()
这两个方法我在《万类之父——Object》中提到过,这是Object类中的方法,这两个方法通常是同时出现,也就是说要重写equals方法时为了保证不出现问题往往需要重写intCode方法。而重写equals则需要满足5个规则(自反性、对称性、传递性、一致性、非空性)。当然具体是如何重写的,此处作为接口并不做解释而是交由它的子类完成。
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey()
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue()
public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp)
public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp)
这四个方法放到一起是因为这都是JDK8针对Map更为简单的排序新增加的泛型方法,这里的泛型方法看似比较复杂,我们针对第一个方法先来简单回顾一下泛型方法。
一个泛型方法的基本格式就是泛型参数列表需要定义在返回值前。这个方法的返回值返回的是Comparator<Map.Entry<K, V>>,也就是说它的泛型参数列表是“<K extends Comparable<? super K>, V>”,有两个泛型参数K和V。参数K需要实现Comparable接口。
既然这是JDK8为Map排序新增的方法,那它是如何使用的呢? 不妨回忆下JDK8以前对Map是如何排序的:
1 /** 2 * Sort a Map by Keys.——JDK7 3 * @param map To be sorted Map. 4 * @return Sorted Map. 5 */ 6 public Map<String, Integer> sortedByKeys(Map<String, Integer> map) { 7 List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet()); 8 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 9 @Override 10 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 11 return o1.getKey().compareTo(o2.getKey()); 12 } 13 }); 14 Map<String, Integer> linkedMap = new LinkedHashMap<>(); 15 Iterator<Map.Entry<Strin g, Integer>> iterator = list.iterator(); 16 while (iterator.hasNext()) { 17 Map.Entry<String, Integer> entry = iterator.next(); 18 linkedMap.put(entry.getKey(), entry.getValue()); 19 } 20 21 return linkedMap; 22 }