Java中的集合類Set是一種無序,無重復元素的集合。Set接口是Collection接口的子接口,它實現了Collection接口中不允許重復元素的特性。Set的常用實現類有HashSet、TreeSet等,本文將著重介紹HashSet。
HashSet
在上述代碼中,我們創建了一個HashSet集合,并調用add方法向集合中添加元素。由于HashSet是不允許重復元素的,因此添加第二個"Java"元素時未生效。最后我們輸出了整個集合,可以發現其無序、無重復、不允許空值等特點。
實際上,HashSet的存儲結構是基于HashMap實現的。HashSet是通過HashMap中的key,將元素值存儲在HashMap中的value中,因此HashSet的底層實現與HashMap類似。
public class HashSetextends AbstractSet implements Set , Cloneable, Serializable { private transient HashMap map; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } public boolean add(E e) { return map.put(e, PRESENT)==null; } }
上述代碼顯示了HashSet的一部分實現。其構造函數中初始化了一個HashMap作為底層存儲結構,并在add方法中調用HashMap的put方法添加元素,而HashSet中的value不需要具體的值,只需要存在即可,因此我們將其定義為static final的PRESENT對象。
在使用HashSet時,還需要注意一些細節問題。例如,如果我們需要向一個空的HashSet中添加一個null值,那么HashSet會正常存儲并返回true,但如果再次向HashSet中添加null值,則返回false。
HashSetset = new HashSet<>(); //創建HashSet集合 set.add(null); //添加null值,返回true set.add("Java"); set.add(null); //再次添加null值,返回false System.out.println(set); //輸出[null, Java]
本文介紹了Java中的Set接口以及其實現類HashSet的使用,以及HashSet的底層存儲結構、元素不重復等特點。在使用HashSet時,我們需要注意它的細節問題,才能更加高效地應用它。