HashSet vs TreeSet vs LinkedHashSet 基于添加重复值

2022-09-01 04:14:24

我正在学习核心java的核心,即.我想知道当我们在 , 、 中添加重复元素时,内部会发生什么情况。CollectionsHashSetTreeSetLinkedHashSet

条目是否被替换、忽略或引发异常,程序将终止。一个子问题是,哪一个具有相同或平均时间复杂度的所有操作

您的回复将不胜感激。


答案 1

Java中的TreeSet,LinkedHashSet和HashSet是集合框架中的三个Set实现,并且像许多其他实现一样,它们也用于存储对象。TreeSet的主要功能是排序,LinkedHashSet是插入顺序,HashSet只是用于存储对象的通用集合。HashSet是使用Java中的HashMap实现的,而TreeSet是使用TreeMap实现的。TreeSet是一个排序集实现,它允许它保持元素按可比或比较器接口定义的排序顺序排列。Compare用于自然顺序排序,Comparator用于对象的自定义顺序排序,可以在创建TreeSet实例时提供。无论如何,在看到TreeSet,LinkedHashSet和HashSet之间的差异之前,让我们看看它们之间的一些相似之处:

1)重复项:所有三个实现设置接口意味着不允许它们存储重复项。

2)线程安全:HashSet,TreeSet和LinkedHashSet不是线程安全的,如果您在多线程环境中使用它们,其中至少有一个线程修改集,则需要从外部同步它们。

3)Fail-Fast迭代器:TreeSet,LinkedHashSet和HashSet返回的迭代器是故障快速迭代器。也就是说,如果迭代器在创建后通过迭代器 remove() 方法以外的任何方式进行修改,它将尽最大努力抛出 ConcurrentModificationException。在此处阅读有关快速故障与故障安全迭代器的更多信息

现在让我们看看Java中的HashSet,LinkedHashSet和TreeSet之间的区别:

性能和速度 :它们之间的第一个区别在于速度。HashSet是最快的,LinkedHashSet在性能上排名第二,或者几乎与HashSet相似,但TreeSet有点慢,因为它需要在每次插入时执行排序操作。TreeSet为添加,删除和包含等常见操作提供有保证的O(log(n))时间,而HashSet和LinkedHashSet提供恒定的时间性能,例如O(1)用于添加,包含和删除给定的哈希函数均匀分布桶中的元素。

排序:HashSet不维护任何顺序,而LinkedHashSet维护元素的插入顺序,就像List接口一样,TreeSet维护排序顺序或元素。

内部实现:HashSet由HashMap实例支持,LinkedHashSet使用HashSet和LinkedList实现,而TreeSet由Java中的NavigableMap备份,默认情况下它使用TreeMap。

null :HashSet 和 LinkedHashSet 都允许 null,但 TreeSet 不允许 null,并在您将 null 插入 TreeSet 时抛出 java.lang.NullPointerException。由于 TreeSet 使用各个元素的 compareTo() 方法来比较它们,从而在与 null 进行比较时引发 NullPointerException,下面是一个示例:

TreeSet cities
Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.compareTo(String.java:1167)
        at java.lang.String.compareTo(String.java:92)
        at java.util.TreeMap.put(TreeMap.java:545)
        at java.util.TreeSet.add(TreeSet.java:238)

比较:HashSet和LinkedHashSet在Java中使用equals()方法进行比较,但TreeSet使用compareTo()方法来维护排序。这就是为什么compareTo()应该在Java中与equals一致。如果不这样做,就会破坏Set接口的一般联系,即它可以允许重复。

使用可以使用下面的链接查看内部实现 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashSet.java#HashSet.add%28java.lang.Object%29

From the source code 
Hashset hases Hashmap to store the data and LinkedHashSet extends Hashset and hence uses same add method of Hashset But TreeSet uses NavigableMap to store the data

资料来源:http://javarevisited.blogspot.com/2012/11/difference-between-treeset-hashset-vs-linkedhashset-java.html#ixzz2lGo6Y9mm


答案 2

此图像可能会对您有所帮助...

enter image description here

图片来源 : http://javaconceptoftheday.com/hashset-vs-linkedhashset-vs-treeset-in-java/