Java基础练习 — HashMap/Hashtable/LinkedHashMap/ConcurrentHashMap的区别

一、HashMap vs Hashtable

一般而言,HashMap几乎可以等价于Hashtable,但在线程安全性同步synchronized速度上存在差异。

1.1 区别

1.1.1 线程安全性不同

  • HashMapsynchronized的,而Hashtablesynchronized,意味着Hashtable是安全的。

1.1.2 key和value是否允许null值

  • HashMap可以接受单个null键(key)值,可以有一个或多个键所对应的值为null,但Hashtable不接受;HashMap允许将null作为一个entrykey或者value,而Hashtable不允许。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

1.1.3 两个遍历方式的内部实现上不同

  • HashMap的迭代器Iteratorfail-fast迭代器(相当于直接在容器中遍历,fail-safe是创建了容器副本,遍历副本时修改不会引发异常),当在迭代过程中修改映射关系时,会造成并发修改异常ConcurrentModificationException。而Hashtableenumerator迭代器不是fail-fast的。

1.1.4 是否提供contains方法

  • HashMapHashtablecontains()方法去掉了,改成containsValue()containsKey(),因为contains()方法容易让人引起误解。
  • Hashtable则保留了contains()containsValue()containsKey()三个方法,其中contains()containsValue()功能相同。

1.1.5 hash值不同

  • 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

1.1.6 内部实现使用的数组初始化和扩容方式不同

  • HashtableHashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTablehash数组默认大小是11,增加的方式是 old*2+1。
  • HashMaphash数组的默认大小是16,而且一定是2的指数。

1.1.7 继承的父类不同

  • Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

二、Hashtable vs ConcurrentHashMap

相比于HashMap,HashtableConcurrentHashMapsynchronized的,上了锁,更加安全,但是仍有所区别。

2.1 区别

  • Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作。
  • ConcurrentHashMap中则是一次锁住一个ConcurrentHashMap默认将hash表分为16个段,诸如get,put,remove等常用操作只锁当前需要用到的桶。

三、HashMap vs LinkedHashMap

3.1 区别

  • Linkedhashmaphashmap子类多了afterbehind方法。
  • LinkedHashMapHashMap多维护了一个链表。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值