HashSet中重寫haseCode和equals
為了儲存數量不確定的資料,以及儲存具有對映關係的資料,Java提供了集合類
集合中的Set,類似一個大罐子,可以依次把1至多個物件存入Set集合,Set集合通常無法記住元素的新增順序
而Set集合中不允許包含兩個相同的元素加入同一個Set集合中,在多個執行緒同時訪問同一個HashSet時,多個執行緒同時修改HashSet集合時,則必須透過程式碼來保證其同步
那麼HashSet是怎麼樣區分不同元素的?這就要說到了 hashCode和equals
在HashSet集合加了一個元素時, HashSet會呼叫該物件的 hashCode方法來得到該物件的hashCode值,然後根據hashCode值決定該物件在HashSet中的位置,如果兩個元素透過equals方法比較返回true,但他們的hashCode方法返回值不相等,HashSet將會把他們存放在不同的位置,依然可以新增成功
也就是說HashSet辨別元素是否相同是透過equals判斷相等加上對比hashCode值
下面看一段程式碼
class h { public boolean equals( object obj) { return true; } } class z { public int hashCode() { return 1; } } class t { public int hashCode() { return 2; } public boolean equals( object obj) { return true; } } public class HashSetTest { public static void main(String[] args) { var b=new HashSet(); b.add(new h); b.add(new h); b.add(new z); b.add(new z); b.add(new t); b.add(new t); System.out.println(b); } }
結果是:
h@5674dd,h@0987as,z@1,z@1,t@2
也就是說,
兩個h物件透過equals方法比較返回true,但HashSet依然把他們當做兩個物件
兩個z物件透過hashCode返回相同值, 但HashSet依然把他們當做兩個物件
兩個t物件 透過equals方法比較返回true, 透過hashCode返回相同值,此時, HashSet才將他們當為一個物件
可見:當把一個物件放入HashSet中如果重寫 equals 就應該重寫 hashCode
當 equals對比兩個物件相等時,如果hashCode不同,則會將兩個相同的元素新增入 HashSet,這就和Set集合的規 則衝突 了
此時,還有一種極端情況:如果hashCode相等,而equals不同,會怎麼樣呢?
那麼,將會更麻煩,HashSet試圖將他們放在一起,但是又不行
所以, 將會採用鏈式結構,儲存多個物件,進而影響效能,導致效能下降
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2677836/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java~重寫hashcode和equalsJava
- java 中為什麼重寫 equals 後需要重寫 hashCodeJava
- 關於重寫equals()和hashCode()的思考
- 重寫equals方法以及重寫tostring方法
- 為什麼重寫equals必須重寫hashCode
- java為什麼要重寫hashCode和equals方法Java
- 關於HashMap的key重寫hashcode和equals的理解HashMap
- 為什麼重寫 equals() 方法,一定要重寫 hashCode() 呢?| HashMapHashMap
- HashSet和HashMapHashMap
- java 中equals和==的區別Java
- equals 和 ==
- Java中的過載和重寫Java
- Java中 equals() 方法和 == 的區別Java
- Java中equals和==比的是什麼Java
- Java中hashcode和equals效能注意點 - ShaiJavaAI
- HashSet、TreeSet、CopyOnWriteArraySet和CopyOnWriteArrayList
- 自定義值型別一定不要忘了重寫Equals,否則效能和空間雙雙堪憂型別
- Java equals 和 == 完全解析Java
- Java equals和==完全解析Java
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- javaSE中的==和equals的聯絡與區別Java
- 向HashSet插入自定義物件判斷是否重複物件
- 小測試:HashSet可以插入重複的元素嗎?
- String的equals和hashCode方法
- Java備忘錄《“==” 和 “equals”》Java
- ==和equals方法的比較
- ==和equals方法的區別
- 搞懂 Java equals 和 hashCode 方法Java
- 【Java】equals 和 == 的區別Java
- 深入探究Java中equals()和==的區別是什麼Java
- c#重寫和多型C#多型
- 淺談C#中重寫和隱藏的區別C#
- String類中的equals方法與Object類中的equals方法的不同點Object
- HashSet
- Java HashMap 和 HashSet 的高效使用技巧JavaHashMap
- 自動生成hashcode和equals方法
- 方法重置和重寫的區別
- 過載和重寫的區別