java – HashSet vs TreeSet vs LinkedHashSet在添加重复值的基础上

前端之家收集整理的这篇文章主要介绍了java – HashSet vs TreeSet vs LinkedHashSet在添加重复值的基础上前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在学习核心 java的心脏,即Collections.I我想知道当我们在HashSet,TreeSet,LinkedHashSet中添加重复元素时,内部会发生什么.

天气条目被替换,忽略或抛出异常并且程序终止.一个小问题是,哪一个在所有操作中具有相同或平均的时间复杂性

您的回应将不胜感激.

解决方法

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

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

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

3)fail-fast Iterator:由TreeSet,LinkedHashSet和HashSet返回的迭代器是故障快速迭代器.即如果Iterator通过除了Iterators remove()方法之外的任何方式创建之后被修改,那么它将尽可能地抛出ConcurrentModificationException.阅读更多关于故障快速vs故障安全迭代器在这里

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

性能和速度:它们之间的差异来自于速度. HashSet是最快的,LinkedHashSet是性能的二分之一,或几乎类似于HashSet,但由于需要在每个插入上执行排序操作,TreeSet有点慢. TreeSet为常用操作(例如add,remove和contains)提供保证的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中时,TreeSet不允许使用null并抛出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一致.没有这样做打破了设置界面的一般接触,即它可以允许重复.

使用可以使用下面的链接查看内部实现
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

原文链接:https://www.f2er.com/java/124220.html

猜你在找的Java相关文章