程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> jvm-對於HashCode的一些疑問!

jvm-對於HashCode的一些疑問!

編輯:編程解疑
對於HashCode的一些疑問!

執行此程序

 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禁止。
值一樣的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved