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

文章目录

  • 一、HashMap vs Hashtable
    • 1.1 区别
      • 1.1.1 线程安全性不同
      • 1.1.2 key和value是否允许null值
      • 1.1.3 两个遍历方式的内部实现上不同
      • 1.1.4 是否提供contains方法
      • 1.1.5 hash值不同
      • 1.1.6 内部实现使用的数组初始化和扩容方式不同
      • 1.1.7 继承的父类不同
  • 二、Hashtable vs ConcurrentHashMap
    • 2.1 区别
  • 三、HashMap vs LinkedHashMap
    • 3.1 区别

一、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多维护了一个链表。

你可能感兴趣的:(Java基础练习)