向HashSet插入自定義物件判斷是否重複

acDream_發表於2018-06-13

一.HashSet概述

HashSet實現Set介面,由雜湊表(實際上是一個HashMap例項)支援。它不保證set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用null元素。

二.儲存方式與實現

如果不等,則新增到該陣列索引對應的連結串列中。

Set的實現類的集合物件中不能夠有重複元素,HashSet也一樣他是使用了一種標識來確定元素的不重複,HashSet用一種演算法來保證HashSet中的元素是不重複的,HashSet採用雜湊演算法,底層用陣列儲存資料。預設初始化容量16,載入因子0.75

Object類中的hashCode()的方法是所有子類都會繼承這個方法,這個方法會用Hash演算法算出一個Hash(雜湊)碼值返回,HashSet會用Hash碼值去和陣列長度取模, 模(這個模就是物件要存放在陣列中的位置)相同時才會判斷陣列中的元素和要加入的物件的內容是否相同,如果不同才會新增進去。

三.Hashset在判斷是否重複機制

當呼叫了 HashSet 的 add 方法存放物件 obj , HashSet 會首先呼叫 obj 的 hasCode 方法得到該物件的雜湊碼, HashSet 會使用一個演算法把它的雜湊碼轉換成一個陣列下標,該下標“標記”了 obj 的位置。如果這個位置上的連結串列中沒有元素,那麼就把 obj 物件新增到連結串列上。如果這個位置上的連結串列中已經有了元素,則遍歷這個連結串列,呼叫 obj 的 equals 方法,判斷 obj 是否和其中的某個元素重複,如果沒有重複的元素,那麼就將 obj 新增到連結串列上;如果有重複的元素,則不會將 obj 物件存入 HashSet 中。


四.自定義物件重複判斷

所以,如果自定義類的插入查重,就要重寫equals方法,在這同時,我們還的先重寫hashCode方法,不然的話,HashSet插入的時候首先判斷的是所生成的hashcode是否相同,如果相同的話,才會呼叫之前重寫的equals方法。

相關文章