set也是乙個介面,他實現了collection和iterable兩個介面,因此,set是乙個集合,同時,我們也可以使用迭代器遍歷set。
set是乙個介面,我們當然不能例項化介面,所以,我們一般實際使用的set有:
hashset
hashset儲存元素的策略,是使用一中稱為「雜湊表」的資料結構,因此,hashset中元素的遍歷是沒有順序的。而通過雜湊表來儲存元素時,都必須首先呼叫元素的hashcode方法來判斷,得出的值我們叫做雜湊碼。當我們像hashset儲存乙個元素的時候,hashset會首先檢查元素的雜湊碼,如果雜湊碼指向的位置為空,則元素可以加進去;如果指向的位置不為空,這就說明了hashset中有某個元素與這個元素的雜湊碼相同,這時候就呼叫equal方法進行兩個元素的比較,如果比較的結果不相同,此元素也可以加進hashset;如果equals比較的結果還是相同,那麼就不能新增此元素。也就是說,每次新增元素都會進行hashcode方法的呼叫,而不一定會呼叫equals方法,這就大大的提高了程式的效率。同時,這也告訴我們,如果我們自己定義的類要使用hashset來管理物件,就一定要重寫hashcode和equals方法。重寫的原則就是保證相同的物件返回的雜湊碼是相同的,equals返回的值是true。
使用hashset的優點就是:查詢效率特別的高,而且在增刪元素的時候,效率也很高,因為是通過雜湊碼來實現的。
使用hashset的缺點就是:使用的空間比較大,這是為了避免雜湊衝突。
linkedhashset
其實和hashset差不多,就是在hashset之前加了乙個linked,也就是說,他還是實現了元素的順序,而不像hashset的隨機。其實,linkedhashset就是hashset的子類。與hashset不同的就是,linkedhashset還有乙個雙重列表(即 linked)。也就是說,我們使用iterator遍歷linkedhashset的時候,不再是隨機的,而是按照我們新增元素的順序。
treeset
treeset其實跟hashset差不多,區別如下:
對於treeset的遍歷,是有順序而言的,而且這個順序是我們可以控制的;而對hashset遍歷,則是沒有順序的。
treeset增刪元素的速度比hashset慢。這一點在小數量的元素中看不錯來,但是在大量的元素中,就比較明顯。
剛剛說了,我們可以對於treeset的遍歷順序進行控制,那麼是怎麼控制的呢?其實,就是在我們自定義的類中實現compareto方法。此方法回來乙個 int 型別的整數。如果返回負值,則排在後面,如果返回正值,則在前面,如果返回0,則兩個元素相等,而set是不允許有重複的元素的,所以這點也保證了set中元素的唯一性。
hashset 雜湊表的內部結構
hashset是個鍊錶陣列。每乙個陣列元素就是乙個列表,我們稱為雜湊表元 。
Java 中的set集合
set集合類似於乙個罐子,程式可以依次把多個物件 丟進 set集合,而set集合通常不能記住元素的新增順序。set集合不允許包含相同的元素,如果試圖把兩個相同的元素加入同乙個set集合中,則新增操作失敗,add 方法返回 false,且新元素不會被加入。一 hashset類是set介面的典型實現類,...
Java中set集合框架
set 元素不可以重複,是無序的 set介面中的方法和collection一致 hashset內部資料結構是雜湊表,是不同步的,無序,不重複 hashset hs new hashset hashset hs new linkedhashset 有序 hs.add new person value1...
Java集合 Set集合總結
特點 無序 不允許重複的 實現類 hashset 通過hash碼資料結構進行儲存的 無序 不重複 如果想要判斷兩個物件是否是同乙個物件 通常情況比較位址,但是現在需要通過制定內容來判斷是否相同 hashcode 判斷的其各個屬性的hashcode 而非物件真正的位址 結論 如果hashcode相同 ...