Java中的Set是一個(gè)接口,HashSet是它的實(shí)現(xiàn)類(lèi)之一。Set是用于保存無(wú)序元素的容器,它不允許重復(fù)元素。而HashSet是一種基于哈希表實(shí)現(xiàn)的Set集合,它通過(guò)hashCode()方法和equals()方法判斷元素是否重復(fù)。
Setset = new HashSet (); set.add(1); set.add(2); set.add(3); set.add(1); // 重復(fù)元素不會(huì)被添加到HashSet中 System.out.println(set.size()); // 輸出3
HashSet的添加、刪除和查找元素的時(shí)間復(fù)雜度都是O(1),因此它的性能非常高。但由于它是基于哈希表實(shí)現(xiàn)的,因此存儲(chǔ)順序是無(wú)序的。
除了HashSet之外,Java中還有其他幾個(gè)Set的實(shí)現(xiàn)類(lèi),如LinkedHashSet和TreeSet。LinkedHashSet是一種特殊的HashSet,它在HashSet的基礎(chǔ)上維護(hù)了一個(gè)按照插入順序排序的鏈表,所以它的元素遍歷順序是有序的。而TreeSet則是一種基于紅黑樹(shù)實(shí)現(xiàn)的有序集合,它實(shí)現(xiàn)了SortedSet接口,可以進(jìn)行一些排序操作。
SetlinkedSet = new LinkedHashSet (); linkedSet.add(2); linkedSet.add(1); linkedSet.add(3); System.out.println(linkedSet.toString()); // 輸出[2, 1, 3] Set treeSet = new TreeSet (); treeSet.add(3); treeSet.add(1); treeSet.add(2); System.out.println(treeSet.toString()); // 輸出[1, 2, 3]
總的來(lái)說(shuō),Set是非常實(shí)用的集合容器,它可以用于快速去重和查找元素。在選擇Set的實(shí)現(xiàn)類(lèi)時(shí),需要根據(jù)具體應(yīng)用場(chǎng)景來(lái)選擇,考慮需不需要有序、性能要求等。在使用HashMap的時(shí)候需要注意元素的hashCode和equals方法要正確實(shí)現(xiàn),否則會(huì)導(dǎo)致元素?zé)o法正確判斷重復(fù)。