- HashMap和Hashtable的区别
- JDK7下的CurrentHashMap(线程安全)
- CurrentHashMap和hashtable的区别
1、继承的父类不同
HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable继承自Dictionary类,Dictionary已经废弃。
2、HashMap线程不安全,HashTable线程安全
Hashtable 中的方法大多是Synchronize的,而HashMap中的方法在一般情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。HashTable实现线程安全的代价就是效率变低,因为会锁住整个HashTable,而ConcurrentHashMap做了相关优化,因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定,效率比HashTable高很多。
3、是否允许null值
Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
HashTable键值对都不能为空,否则包空指针异常。
4.解决hash冲突方式不同
hashmap
java8之前 数组+链表 java8之后 数组+链表+红黑树 1.如果冲突数量小于8,则是以链表方式解决冲突。 2.而当冲突大于等于8时,就会将冲突的Entry转换为 红黑树 进行存储。 3.而又当数量小于6时,则又转化为链表存储。
而在HashTable中, 都是以链表方式存储。
5、HashMap是没有contains方法的,hashtable有
6、计算hash值方式不同
7、扩容方式不同(容量不够)
当容量不足时要进行resize方法,而resize的两个步骤: ①扩容; ②rehash:这里HashMap和HashTable都会会重新计算hash值而这里的计算方式就不同了(看5); HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入; 而Hashtable扩容为原容量2倍加1;JDK7下的CurrentHashMap(线程安全)
在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成,主要实现原理是实现了锁分离的思路解决了多线程的安全问题,如下图所示:
Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样。
CurrentHashMap和hashtable的区别ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。
左边便是Hashtable的实现方式—锁整个hash表;而右边则是ConcurrentHashMap的实现方式—锁桶(或段)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)