这里着重分析一下currentHashMap和HashMap,顺带分析一下Hashtable
首先HashMap是基于哈希表的map接口的实现类,允许null值null键,不保证顺序。它的底层是通过数组和链表实现的,数组元素存放链表,当我们在hashmap中添加元素的时候,首先根据key的hash算法找到对应的数组下标,在添加值得时候根据equals方法决定链表的位置,如果是新的就直接添加。同样在取出对应node时,先计算对应key的hash值,找到对应的数组下标,根据equals方法从链表上响应的位置,另外在1.8中规定,当链表结点数超过8个以后,链表会转变成红黑树结构以提高查询效率。
Hashtable也是基于哈希表的map接口的实现类,不允许null值null键,底层也是通过数组和链表实现的,但有点不同的是,在底层hashtable将entry当成一个entry对象,存和取的方式和hashmap相同,通过hash算法计算出对应的数组下标,然后equals方法计算出链表上的位置。
接下来讲下CurrentHashMap,它最大的特点就是可以实现并发操作,具体怎么实现的呢?
首先要提到一个锁分离技术,从字面意思解释就是,锁分开在不同的地方,具体分离在什么地方呢?CurrentHashMap使用了多个锁来控制对Hash表的不同段的操作,每一个段就是一个小的hashtable,同时在不同的段进行操作,即实现了所谓的并发。
与hashMap不同的是,CurrentHashMap使用多个子Hash表,也就是段,ConcurrentHashMap允许多个读操作并发进行,读操作并不需要加锁。如果使用传统的技术,如HashMap中的实现,如果允许可以在hash链的中间添加或删除元素,读操作不加锁将得到不一致的数据。