Java学习 - Set使用

Java Set 用法

Java 的set接口由两种类实现,一种是底层基于散列表的HashSet,另一种是底层基于红黑树的TreeSet。此外,HashSet还有派生类LinkedHashSet。

set代表的是数学上的集合的意思,所以set中的元素不可以重复
所以set中查找是最为重要的操作。

HashSet, LinkedHashSet 以及 TreeSet之间的区别

性能和速度:他们之间的第一个区别来自速度,HashSet 是最快的,LinkedHashSet 在性能方面排第二,或者近乎接近于HashSet,TreeSet稍微慢一些,因为每一次插入元素都需要执行排序操作。TreeSet 对于常见操作如add,remove,contains等能够保证时间复杂度为 O(log(n)) ,而 HashSet 和 LinkedHashSet 对于add,contains,remove等操作提供时间复杂度为常数时间的性能,因为HashSet为给定散列函数在桶中均匀分配元素。

排序性:HashSet 不保证元素的任何顺序,而LinkedHashSet 保持元素的插入顺序,更多的像List接口一样,TreeSet 按照元素实现的比较接口保持元素的顺序。

内部实现:HashSet底层基于一个HashMap实例,LinkedHashSet 基于HashSet和LinkedList实现,TreeSet底层基于NavigableMap接口实现,java中默认用TreeMap实现。

null值:HashSet 和 LinkedHashSet允许null值,但是TreeSet 不支持null值,并且当你向TreeSet中插入null值时会抛出 java.lang.NullPointerException 异常。因为TreeSet应用 compareTo() 方法于各个元素来比较他们,当比较null值时会抛出 NullPointerException异常。

比较(Comparison ):HashSet 和 LinkedHashSet 用 equals() 方法用于比较,但是TreeSet 用 compareTo() 方法用于维持元素顺序。这就是为什么在java中compareTo()和 equals() 必须保持一致,否则会打破Set接口的一些通用规则,比如可能会允许重复值。

何时用 HashSet, TreeSet 以及 LinkedHashSet

所有三种Set接口实现都可以用于通用的Set操作,比如不允许重复元素,但是三者又都有其独特的特性,所以在特定的环境下可以有更合适的选择。 由于TreeSet保持元素顺序,所以当你需要一个集合保持元素顺序并且不允许重复元素时,可以使用TreeSet;HashSet是通用的Set集合实现,如果你需要一个效率比较快、且不允许重复元素的集合,则可以使用HashSet;LinkedHashSet 是HashSet的扩展,它更适合当你需要保持元素的插入顺序时使用,更像一个不牺牲昂贵性能的List。LinkedHashSet 的另一个用法是用于创建一个已经存在的Set集合的副本,因为LinkedHashSet 保持插入顺序,它返回包含同一顺序的相同元素的集合,更像精确的复制。总之,尽管他们三个都是Set接口的实现,但是他们均有各自独特的特性,HashSet是一个通用功能的Set,而LinkedHashSet 提供元素插入顺序保证,TreeSet是一个SortedSet实现,由Comparator 或者 Comparable指定的元素顺序存储元素。

Set 的使用

创建方式

HashSet<Integer> st = new HashSet<Integer>();

插入元素

st.add(...); 

删除元素

st.remove(...);

存在性判断

st.contains(...); // 返回boolean

判空

st.isEmpty(); // 返回boolean 

容量

st.size(); // 返回逻辑大小
posted @ 2020-10-20 11:47  popozyl  阅读(424)  评论(0编辑  收藏  举报