Java中的HashMap VS LinkedHashMap VS TreeMap VS HashTable

时间:2020-01-09 10:35:04  来源:igfitidea点击:

如果必须在Java应用程序中存储(键,值)对,则将使用java.util包中存在的基于哈希表的实现之一,选项为HashMap,LinkedHashMap,TreeMap和HashTable。我们选择的Map实现将基于以下条件:是否需要同步,是否需要任何排序以及性能。由于Map实现提供的功能有所不同,因此HashMap,LinkedHashMap和TreeMap之间必须存在一些差异,这就是我们将在本文中看到的。

Java中的HashMap VS LinkedHashMap VS TreeMap VS HashTable

1首要标准是同步。

  • HashMap – HashMap不同步,如果必须在多线程环境中使用,则必须使用Collections.synchronizedMap()方法在外部同步HashMap。
  • LinkedHashMap – LinkedHashMap不同步,如果必须在多线程环境中使用它,则必须使用Collections.synchronizedMap()方法从外部对其进行同步。
  • TreeMap – TreeMap不同步,如果必须在多线程环境中使用它,则必须使用Collections.synchronizedSortedMap()方法从外部对其进行同步。
  • HashTable – Hashtable是同步的,因此提供了线程安全性。

2第二个条件是排序。

  • HashMap – HashMap是无序的Map实现。
  • LinkedHashMap –根据用于构造LinkedHashMap的构造函数,维护插入顺序或者访问顺序(从最近访问的到最近访问的)。
  • TreeMap-在TreeMap中,默认情况下,元素是根据其自然顺序排序的。如果要进行任何自定义排序,则必须提供一个比较器。
  • HashTable – HashTable也是无序的。

3第三条标准允许空值作为键和值。

  • HashMap-允许将null用作键以及值。尽管允许多个空值,但仅允许单个空键。
  • LinkedHashMap –允许将null用作键以及值。尽管允许多个空值,但仅允许单个空键。
  • TreeMap – TreeMap不允许null为键。如果尝试将null添加为键,则抛出NullPointerException。空值是允许的。
  • HashTable –与HashMap相同。

4第四标准是内部实施。

  • HashMap –在HashMap内部实现中,使用类型为Node的数组存储元素。数组的每个索引都被视为一个存储桶。
  • LinkedHashMap –扩展HashMap并使用与HashMap相同的内部存储。 LinkedHashMap还维护一个贯穿其所有条目的双向链接列表。此链表定义了迭代顺序。
  • TreeMap – TreeMap使用树结构,其中存储了Entry类型的元素。 TreeMap是基于Red-Black树的NavigableMap实现。
  • HashTable –在HashTable内部,一个Entry类型的数组用于存储元素。

5第五个条件是默认初始容量。

  • HashMap –默认初始容量为16.
  • LinkedHashMap –默认初始容量为16.
  • TreeMap –没有默认容量,因为未使用数组。
  • HashTable –默认初始容量为11.

6第六个标准是性能。

  • HashMap-HashMap为基本操作(获取和放置)提供了恒定时间的性能,并假设哈希函数可以在存储桶之间正确分配元素。
  • LinkedHashMap – LinkedHashMap的性能可能会略低于HashMap,因为维护双向链表会增加开销。
  • TreeMap – TreeMap为containsKey,get,put和remove操作提供了保证的log(n)时间成本。
  • HashTable – HashTable的所有方法都在单个锁上同步,因此速度很慢。