Map接口
1、体系
2、Hashtable和HashMap的比较:
(1)Hashtable的大部分方法都做了同步,HashMap没有,所以HashMap是非线程安全的。
(2)Hashtable不允许key或者value为null,HashMap可以。
(3)二者在对key的hash算法和hash值到内存索引的映射算法不同。
3、HashMap的实现原理:
(1)将key做hash算法,然后将hash值映射到内存地址,直接取得key所对应的数据。
(2)底层数据结构是一个Entry类型的数组(数组+链表),所谓的内存地址即数组的下标索引。
(3)计算key的hash值分别调用了Object类的hashCode()方法(native方法)和HashMap的内部函数基于位运算实现的hash(),确保高效性。
int hash = hash(key.hashCode()); public native int hashCode(); static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }
(4)当取得key的hash值后,需要通过hash值得到内存地址:通过将hash值和数组长度按位取与直接得到数组索引。
int i = indexFor(hash, table.length); static int indexFor(int h, int length) { return h & (length - 1); }
4、扩容:
(1)默认情况下,HashMap初始大小为16,负载因子为0.75。
(2)内部维护了一个threshold变量 = 内部数组总大小 * 负载因子,表示HashMap的阈值,当HashMap的实际容量超过阈值时,HashMap就会进行翻倍扩容。
5、LinkedHashMap的特征:
(1)继承自HashMap,是一个有序的hashMap,默认按照插入顺序排序,当传入构造函数accessOrder的值为ture时按照元素最后访问时间排序。
(2)所有集合都不允许在迭代器模式中修改集合的结构,在按照元素访问顺序的模式中,get()方法会修改LinkedHashMap中的链表结构,将最近访问的元素放置在链表的末尾,因此会抛出ConcurrentModification异常。
6、TreeMap的实现:
(1)根据元素的key进行排序,要么在构造函数中注入一个Comparator,要么使用一个实现了Comparable接口的key。
(2)内部实现是基于红黑树,红黑树是一种平衡查找树。
(3)TreeMap提供了简明的接口对有序的key集合进行筛选,比如subMap()、headMap()、tailMap()等,它们的结果集也是一个有序的Map。