1.Map及其相关的导出类
AbstractMap是JDK提供的实现Map借口的抽象类,Map的实现类基本都是继承该抽象类java.util.concurrent包的java的并发工具包。
java.util包的相关类:
Hashtable
AbstractMap
SortedMap
NavigableMap
HashMap
TreeMap
WeakHashMap
IdentityHashMap
LinkedHashMap
java.util.concurrent包的相关类:
ConcurrentMap
ConcurrentNavigableMap
ConcurrentHashMap
2.Map文档描述
Map接口取代Dictionary抽象类
Map提供三个集合视图:keySet(),values(),entrySet()
Map集合视图的排序即为Map内部元素排列顺序。TreeMap为排序提供保证,HashMap则没有。
将可变的对象用作key要当心,因为HashMap根据key的hashcode放置该条目,key发生变化,hashcode可能改变,造成map.get(key)根据hashcode找不到该条目。由于AbstractMap的hashcode是根据所有条目计算出来的,最好不要将自己当做key:
1.HashMap 在get(key)的时候,会计算key的hashcode,由于key是本身,而本身的hashcode又是由所有条目的key和value的hashcode计算得来,循环调用,会发生栈溢出StackOverflowError。但HashMap可以把自己当做value。
2.TreeMap 的key要实现Comparable接口,在插入map的时候,会调用compare()方法。而TreeMap本身没有实现这个接口,会报类型转换错误ClassCastException。
3.WeakHashMap虽然没有继承HashMap,但和HashMap一样,会发生StackOverflowError。
4.IdentityHashMap不会报错。
Map的实现类一般都会有一个默认构造器,和带一个map参数的构造器。前者会创建一个空Map,后者可用来复制map。这个建议没有强制保证(Map作为接口没有构造器),但JDK里面的Map实现类都遵从该规则。
集合框架接口里的一些方法依赖于equals方法,如containsKey(Object key) 方法,先比较hashcode 再去比较equals (Object.hashCode()保证两个不等的对象hashcode不相等)。
3.Map接口的方法
从getOrDefault方法到最后,是Java8之后引入的,都是default关键字定义的方法,有具体实现。Java 8 为了支持lambda表达式,引入新的关键字default,default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。
4.Map内部接口 Entry< K,V >
承载map条目(一对key和value)
有getkey(),getvalue(),setvalue(v)方法声明
euqals(object)返回key.equals(key)&&value.equals(value)
hashCode()返回key.hashcode()^value.hashcode().
静态方法comparingByKey(),comparingByValue(),该方法是jdk1.8引入的
(Comparator< Map.Entry< K, V >> & Serializable)是java 8新语法,表示同时满足两个类。
接口的静态方法不会被继承,只能通Map.Entry.comparingByKey()调用。