equals() 與 ==
對于基本類型,== 判斷兩個值是否相等,基本類型沒有 equals() 方法。
對于引用類型,== 判斷兩個變量是否引用同一個對象,而 equals() 判斷引用的對象是否等價。
hashCode() 傳回散列值,而 equals() 是用來判斷兩個對象是否等價。等價的兩個對象散列值一定相同,但是散列值相同的兩個對象不一定等價。
在覆寫 equals() 方法時應當總是覆寫 hashCode() 方法,保證等價的兩個對象散列值也相等。
clone() 是 Object 的 protected 方法,它不是 public,一個類不顯式去重寫 clone(),其它類就不能直接去調用該類執行個體的 clone() 方法。
應該注意的是,clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一個 protected 方法。Cloneable 接口隻是規定,如果一個類沒有實作 Cloneable 接口又調用了 clone() 方法,就會抛出 CloneNotSupportedException。
淺拷貝
拷貝對象和原始對象的引用類型引用同一個對象。
深拷貝
拷貝對象和原始對象的引用類型引用不同對象。
使用 clone() 方法來拷貝一個對象即複雜又有風險,它會抛出異常,并且還需要類型轉換。Effective Java 書上講到,最好不要去使用 clone(),可以使用拷貝構造函數或者拷貝工廠來拷貝一個對象。
哪個類包含 clone 方法? 是 Cloneable 還是 Object?
java.lang.Cloneable 是一個标示性接口,不包含任何方法,clone 方法在 object 類中定義。并且需要知道 clone() 方法是一個本地方法,這意味着它是由 c 或 c++ 或 其他本地語言實作的。
有沒有可能兩個不相等的對象有有相同的 hashcode?
有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是為什麼在 hashmap 中會有沖突。相等 hashcode 值的規定隻是說如果兩個對象相等,必須有相同的hashcode 值,但是沒有關于不相等對象的任何規定。
兩個相同的對象會有不同的的 hash code 嗎?
不能,根據 hash code 的規定,這是不可能的。
我們可以在 hashcode() 中使用随機數字嗎?
不行,因為對象的 hashcode 值必須是相同的。
為什麼在重寫 equals 方法的時候需要重寫 hashCode 方法?
因為有強制的規範指定需要同時重寫 hashcode 與 equal 是方法,許多容器類,如 HashMap、HashSet 都依賴于 hashcode 與 equals 的規定。
a.hashCode() 有什麼用? 與 a.equals(b) 有什麼關系?
hashCode() 方法是相應對象整型的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關系特别緊密。
根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。
1、hashcode的作用
List和Set,如何保證Set不重複呢?
通過疊代使用equals方法來判斷,資料量小還可以接受,資料量大怎麼解決? 引入hashcode,實際上hashcode扮演的角色就是尋址,大大減少查詢比對次數。
2、hashcode重要嗎
對于數組、List集合就是一個累贅。而對于hashmap, hashset, hashtable就異常重要了。
3、equals方法遵循的原則
對稱性 若x.equals(y)true,則y.equals(x)true
自反性 x.equals(x)必須true
傳遞性 若x.equals(y)true,y.equals(z)true,則x.equals(z)必為true
一緻性 隻要x,y内容不變,無論調用多少次結果不變 其他 x.equals(null) 永遠false,x.equals(和x資料類型不同)始終false