几种常见数组的底层实现原理(HashMap、hashtable、ConcurrentMap)

一、HashMap的底层数据结构叙述:
(1)实现Map集合;
(2)底层数据结构是数组链表结构,数组的初始容量是16,每次扩容的大小是上一次的2倍,源码中是capacity <<= 1,所以每次扩容后的容量是上一次的两倍;
(3)不允许null的key和null的value,如果出现null的key和null会报出异常的现象;
(4)HashMap的存储,先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,如果table数组在该位置处有元素,则通过比较是否存在相同的key(equals方法),若存在则覆盖原来key的value,否则将该元素保存在链头(最先保存的元素放在链尾)
(5)可以从源码中看出没有任何同步的代码,说明不是线程安全的。
二、hashtable的底层数据结构叙述
(1)实现Map集合
(2)底层数据结构是数组链表结构,数组的初始容量是10,每一次扩容的大小是上一次的2倍+1,
源码中是 (oldCapacity << 1) + 1;
(3)允许null的key和value
(4)Hashtable在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
(5)线程同步,有synchronized对其中的方法进行修饰
三、ConcurrentMap的底层讲解
(1)ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术
(2)它使用了多个锁来控制对hash表的不同段进行的修改,每个段其实就是一个小的hashtable,
它们有自己的锁。只要多个并发发生在不同的段上,它们就可以并发进行。
(3)ConcurrentHashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
(4)与HashMap不同的是,ConcurrentHashMap使用多个子Hash表,也就是段(Segment)
(5)ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。
如果使用传统的技术,如HashMap中的实现,如果允许可以在hash链的中间添加或删除元素,读操作不加锁将得到不一致的数据。ConcurrentHashMap实现技术是保证HashEntry几乎是不可变的。

猜你喜欢

转载自blog.csdn.net/ocean_java666/article/details/81626481