当前位置: 代码迷 >> 综合 >> HashMap、HashTable、以及ConcurrentHashMop的区别
  详细解决方案

HashMap、HashTable、以及ConcurrentHashMop的区别

热度:75   发布时间:2023-11-22 23:43:59.0

 一、HashMop;

HashMop在JDK1.8之前的实现方式为  :数组+链表

在JDK1.8之后对HashMop进行了底层优化,改为由  数组+链表+红黑树实现,主要目的是提高查询效率;

 HashMap的数据插入原理;

(1)判断数组是否为空,为空进行初始化;

(2)不为空,计算 k 的 hash 值,通过(n - 1) & hash计算应当存放在数组中的下标 index;
(3)查看 table[index] 是否存在数据,没有数据就构造一个 Node 节点存放在 table[index] 中;(4)存在数据,说明发生了 hash 冲突(存在二个节点 key 的 hash 值一样), 继续判断 key 是否相等,相等,用新的 value 替换原数据(onlyIfAbsent 为 false);
(5)如果不相等,判断当前节点类型是不是树型节点,如果是树型节点,创造树型节点插入红黑树中;
(6)如果不是树型节点,创建普通 Node 加入链表中;判断链表长度是否大于 8, 大于的话链表转换为红黑树;
(7)插入完成之后判断当前节点数是否大于阈值,如果大于开始扩容为原数组的二倍。

HashMap初始化怎样设置初始化容量

         一般如果new HashMap() 不传值,默认大小是 16,负载因子是 0.75, 如果自己传入初始大小 n,初始化大小为 大于 n 的 2 的整数次方;

例如:如果传 5,大小为 8。

二、HashMap和HashTable的区别是什么?

(1)HashMap不是线程安全的

        HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含

重复键,但可以包含重复值。

        HashMop允许null值和null键,而HashTable不允许。

(2)HashTable是线程安全的

        HashMap是Hashtable的轻量级实现(非线程安全的实现)。

        他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

        HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差。

三、ConcurrentHashMop与前两者的区别

        虽然jdk提供了HashMap和HashTable但是如何同时满足线程安全和效率高呢,显然这两个都无法满足,所以就诞生了ConcurrentHashMap神器,让我们应用于高并发场景。

        该神器采用了分段锁策略,通过把整个Map分成N个Segment(类似HashTable),可以提供相同的线程安全,效率提升N倍,默认提升16倍。

        ConcurrentHashMap的优点就是HashMap和HashTable的缺点,当然该神器也是不支持键值为null的。

        ConcurrentHashMap的出现也意味着HashTable的落幕,所以在以后的项目中,尽量少用HashTable。

  相关解决方案