Java中的HashSet , LinkedHashSet 和 TreeSet比较

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

如果我们只需要存储唯一的元素,即在Java应用程序中没有重复的元素,则可以选择使用Java中的Set实现之一; HashSet,TreeSet或者LinkedHashSet。尽管所有这些Set实现都存储唯一的元素,但是它们在诸如元素顺序,它们提供的性能,是否允许空值等方面确实有所不同。在本文中,我们将看到Java中HashSet,LinkedHashSet和TreeSet之间的差异,这些差异将确定哪种Set实现更好地满足目的。

Java中 HashSet VS LinkedHashSet VS TreeSet

1元素的订购

HashSet – HashSet是无序集合。基于为元素计算的哈希值存储元素。
LinkedHashSet –在LinkedHashSet中,元素的插入顺序保持不变。
TreeSet – TreeSet按排序顺序存储其元素。默认情况下,元素以自然顺序排序,但是如果我们想要不同的顺序,则可以提供Comparator。

2内部实施

HashSet – HashSet在内部使用HashMap存储is元素。
LinkedHashSet –内部LinkedHashSet由LinkedHashMap实例支持。
TreeSet –内部TreeSet使用TreeMap存储其元素。

3允许空值

HashSet – HashSet允许一个空值。
LinkedHashSet – LinkedHashSet允许一个空值。
TreeSet –在TreeSet中,不允许为null。如果尝试将null添加到TreeSet,则抛出NullPointerException。

4元素比较

HashSet –为了比较元素,以便不添加重复元素,HashSet使用equals()和hashCode()方法。
LinkedHashSet – LinkedHashSet也使用equals()和hashCode()方法。
TreeSet – TreeSet实例使用其compareTo(或者compare)方法执行所有元素比较。

5性能

HashSet – HashSet是三者中最快的,因为它没有维护插入顺序或者排序的添加功能。 HashSet为基本操作(如添加,删除,包含和大小)提供恒定的时间性能O(1),前提是哈希函数将元素正确地分布在存储桶中。如果HashCode不正确,并且元素未正确分散,那么在最坏的情况下性能可能下降为O(n)。
LinkedHashSet – LinkedHashSet的性能仅略低于HashSet。这是因为LinkedHashSet维护了一个遍历其所有条目的双链表。此链表定义了迭代顺序。
TreeSet – TreeSet很慢,因为它必须保持其元素排序。它使用基于树的结构,因此TreeSet为基本操作(添加,删除和包含)提供了保证的log(n)时间成本。