HashSet類主要是設計用來做高性能集運算的,例如對兩個集合求交集、並集、差集等。集合中包含一組不重復出現且無特性順序的元素。
(一)HashSet的一些特性如下:
1、HashSet中的值不能重復且沒有順序。
2、HashSet的容量會按需自動添加。
(二)那么HshSet是如何做到集合中的值不重復呢?
當使用HashSet時,hashcode()方法就會得到調用,它會先判斷已經存儲在集合中的對象的hash code值是否與新增加的對象的hash code的值一致,如果不一致,就直接加入到集合中;如果一致,那么再進行equals方法的比較,如果equals方法返回true,說明對象已經存在,所以不加進去了,否則加進去。
(三)HashSet里面並沒有get()方法,那么我們就要用迭代器Iterator
迭代器(Iterator)模式,又叫做游標(Cursor)模式:
提供一種方法訪問一個容器(container)對象中各個元素,而又不需暴露該對象的內部細節。 從定義可見,迭代器模式是為容器而生。很明顯,這里的容器對象是HashSet。
主要用到的方法主要有兩個:
a)hasNext()方法:判斷容器是否有下一個元素,是的話返回true,不存在的話返回false。
b)next()方法:取出下一個元素。
那么,如何用迭代器來輸出HashSet的內容呢,看下面代碼:
上述代碼生成了一個 Iterator 對象, while結構利用hasNext()方法遍歷HashSet的元素,再利用next()方法訪問。
(五)HashSet底層是使用HashMap實現的,當使用add方法將對象添加到Set當中時,實際上是將該對象作為底層所維護的Map對象的key,而value則都是同一個Object對象,這個Object對象實際上我們是用不上的。而Map對象的底層是一個一個Entry對象組成。
(六)當向HashMap中put一對鍵值時,它會根據key的hashCode值計算出一個位置,該位置即使此對象准備往數組中存放的位置。
如果計算出的位置沒有對象存在,就把此對象放在那個位置,如果該位置已經存在對象,則順着該位置的對象的鏈開始尋找(Entry類有一個Entry類型的next成員變量,指向該對象的下一個對象),不斷地調用equals方法跟鏈上的對象進行比較,如果鏈上的對象與這個要插入的對象的equals方法都返回false,則把這個對象插入到該位置的最前面,並且指向原來鏈上的第一個Entry對象。
如圖: