天气条目被替换,忽略或抛出异常并且程序终止.一个小问题是,哪一个在所有操作中具有相同或平均的时间复杂性
您的回应将不胜感激.
解决方法
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