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。

posted on 2019-09-07 15:07  逍遥1989  阅读(157)  评论(0编辑  收藏  举报