集合hashset中物件的特點是無序、不允許重複。無序好理解,那麼兩個什麼樣的物件算重複呢?
兩個物件重複意味著這兩個物件的內容相同、hashcode
值也相同。
(1)兩個物件a和b內容相同,表示a.equals(b)的值為true。
(不重寫的話,預設equals()方法是呼叫」=="
進行判斷的,」=="
判斷的是兩個物件的引用是否相同)
(2)如果你不重寫hashcode()方法的話,兩個物件的hashcode值在預設情況下是不可能相同的。
hashcode()方法繼承自object類。每個物件在建立的時候會被分配乙個唯一的hashcode值(乙個整形的值)。所以不重寫hashcode()方法的話,兩個物件的hashcode值是不會相同的。
注意string的hashcode()方法已經被重寫,所以兩個不同的string物件的hashcode值有可能相同,比如下面的式子的最終結果將是true,雖然str0和str是兩個不同的物件。
string str0 = new string("hello!"); string str = new string("hello!"); system.out.println(str0.hashcode()==str.hashcode());
只有同時滿足以上兩個條件的物件,才能算的上重複,這兩個物件在加入到hashset中的時候只能新增進乙個。
兩個hashcode值相等的物件,equals()返回值不一定為true;而如果兩個物件的equals方法返回值為true,則兩個物件的hashcode值必須相同,也即如果你重寫equals()方法的話,則你必須重寫hashcode()方法。
另外:還有乙個我們經常用到的是判斷兩個物件的引用是否相等,即使用」=="
符號進行判斷,引用表示的是物件在記憶體(堆)中的存放位址,很顯然兩個不同的物件的位址是不可能相等的,即使兩個物件的值相等(equals()結果返回true)。例如下面的例子講分別返回true和false。
string str0 = new string("hello!"); string str = new string("hello!"); system.out.println(str0.equals(str)); system.out.println(str0==str);真繞啊!
java集合框架 HashSet
目錄 1.無序 唯一 2.真的唯一麼?3.先入為主 4.set的其他實現類 hashset實現了set介面,內部主要是通過hashmap實現的.1.無序 唯一public class hashsetdemo1 collections.addall set,str system.out.println...
HashSet集合,map集合
hashset集合 遍歷通過迭代器iterator遍歷 它儲存的是無序集合 不允許重複資料新增 string strs new string 10 hs.toarray strs 轉換hashset集合到strs陣列中 hashset物件去重的原理 雜湊表依賴兩個方法hashcode 和equals...
java集合 最常用的HashSet類判斷
把物件內每個有意義的例項變數 就是equals 方法判斷過的例項變數 計算出乙個int 型別的hashcode值,計算方式如下 hashcode值的計算方式 例項變數型別 計算方式 例項變數型別 計算方式 整數型別 int short,char,byte hashcode int f float h...