Ch01-Java Map 之 HashMap

Ch01-Java Map 之 HashMap

February 10, 2017
Java | Map
Java

1. 底层数据结构 #

Java 1.7 中使用数组+链表这样的数据结构,自 Java 1.8 开始使用数组+链表+红黑树这样的数据结构。

hashmap

2. 数组扩容 #

resize() 方法用于初始化数组或数组扩容,每次扩容后,容量为原来的 2 倍,并进行数据迁移。

3.线程不安全 #

HashMap 的线程不安全主要体现在下面两个方面:

  1. 在 Java 1.7 中,当并发执行扩容操作时会造成环形链。

    这里主要的原因是线程1上线文中保存的指针指向的数据(newtable,临界资源)被线程2做了修改,当线程1重新恢复上线文后,在已经被修改的数据(newtable,临界资源)上继续未完成的操作,最终导致结果不符合预期。

  2. 在 Java 1.8 中,在并发执行 put 操作时会发生数据覆盖的情况。

4. 参考文献 #