hashMap ,hashTable ,concurrentHashMap区别

1.实现方式

   public class hashTable extends Dictionary implements Map

   public class hashMap extends  AbstractMap implements Map 

   public class concurrentHashMap extends AbstractMap ......

    hashTable 和hashMap 都是实现了Map接口,但是hashTable 是继承的Dictionary抽象类。

  concurrentHashMap比hashMap多Segment类,是可重入锁,锁分段技术保证线程安全的

2.安全性

hashTable是线程安全的。整个数组只有一把锁,只要一个线程锁住(读或写),其他线程只能等待。并发性能差。

hashMap 是线程不安全的。没有加锁机制。但是Collections.synchronizedMap(hashMap map)可以返回安全的实例。

concurrentHashMap是线程安全的。是将数组分为若干个小数组,每个小数组维护自己的锁。并发性能较好。

3.使用。

hashTable不能使用null做为key ,value的值。

hashMap可以使用null作为key,value的值。get()方法返回为null时,有可能不存在该值或是值为null,所以用containsKey()方法判断是否存在某个键。

concurrentHashMap不允许key,value值为null

4.迭代

hashMap使用Iterator迭代器。是fail-fast迭代器。所以当线程改变hashMap的结构,会抛出concurrentModification异常。

hashTable历史使用了Enumeration迭代器,但同时也添加了Iterator迭代器。Enumeration不是fail-fast迭代器

5.hashCode

hashTable直接使用了对象的hashCode,hashMap重新计算hash值。

同时,两个内部实现数组的初始大小和扩容方式也不同。

concurrentHashMap也是重新计算hash值。

使用一个对象作为key值时,要重写equals方法,同时要重写hashCode方法。因为是通过hashCode来确定散列到table中的位置,若有值再用equals判断key是否相等。若不重写hashCode,两个对象会被散列到不同的位置,导致错误的结果。

PS:HashMap:jdk1.6中使用的是桶加链,jdk1.8中使用的是桶加链加红黑树

jdk1.8中index计算方式:h^(h>>>16)&(n-1)

若h为1111 1111 1111 1111 1111 0000 1110 1010 则计算index为0101 ---> 5.

6.hash冲突

参考文章:http://www.360doc.com/content/14/0721/09/16319846_395862328.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值