Ch01-Java Map 之 HashMap
February 10, 2017
1. 底层数据结构 #
Java 1.7 中使用数组+链表
这样的数据结构,自 Java 1.8 开始使用数组+链表+红黑树
这样的数据结构。
2. 数组扩容 #
resize() 方法用于初始化数组或数组扩容,每次扩容后,容量为原来的 2 倍,并进行数据迁移。
3.线程不安全 #
HashMap 的线程不安全主要体现在下面两个方面:
-
在 Java 1.7 中,当并发执行扩容操作时会造成环形链。
这里主要的原因是线程1上线文中保存的指针指向的数据(newtable,临界资源)被线程2做了修改,当线程1重新恢复上线文后,在已经被修改的数据(newtable,临界资源)上继续未完成的操作,最终导致结果不符合预期。
-
在 Java 1.8 中,在并发执行 put 操作时会发生数据覆盖的情况。