執行此程序
public class Test {
public static void main(String[] args) {
Emp emp = new Emp();
System.out.println(emp);
System.out.println(emp.hashCode());
}
}
class Emp{
String id;
String name;
}
輸出
Emp@15db9742
366712642
誰能解釋一下,這兩個值代表什麼
366712642這個值代表的是emp對象的hashcode(hashcode是根據hash算法計算出來的)
那第一個值是什麼東西?emp@後面為什麼不是哈希值?
首先我們把代碼稍微改一下:
public class Test {
public static void main(String[] args) {
Emp emp = new Emp();
System.out.println(emp.toString());
System.out.println(emp.hashCode());
}
}
class Emp{
String id;
String name;
}
改的地方是main方法第二行,本來你寫的是emp,改成emp.toString();
你會發現執行結果和你的執行結果幾乎可以說是一樣。因為調用println方法,底層會默認調用toStrintg()
所以現在我們只要 弄清hashCode()與 toString()方法有什麼區別就行了。
現在看看hashCode()方法,點進去,看代碼注釋:
返回對象的哈希碼值。支持該方法以利於哈希表,例如由java.util.HashMap提供的哈希表。
hashCode的一般合同是:
•無論何時在Java應用程序執行期間在同一對象上多次調用同一對象時,如果對對象的equals比較中使用的信息不被修改,則hashCode方法必須始終返回相同的整數。從應用程序的一個執行到相同應用程序的另一個執行,此整數不需要保持一致。
•如果根據equals(Object)方法兩個對象相等,則對這兩個對象中的每一個調用hashCode方法必須產生相同的整數結果。
•如果根據java.lang.Object.equals(java.lang.Object)方法,兩個對象不相等,則不需要調用這兩個對象中的每一個上的hashCode方法,這些方法必須產生不同的整數結果。然而,程序員應該意識到,為不等對象產生不同的整數結果可以提高散列表的性能。
盡管合理實用,但Object類定義的hashCode方法會為不同對象返回不同的整數。 (這通常通過將對象的內部地址轉換為整數來實現,但JavaTM編程語言不需要此實現技術。)
從最後一句話你能看出,hashCode是根據對象內部地址獲得的,你就簡單理解為內存地址。
toString呢?
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
看見沒,將hashCode轉為16進制顯示了。所以你的問題就能解答了。他們都是hashCode,只是不同進制而已,一個十進制,一個16禁止。
值一樣的。