簡體   English   中英

Java中的對象身份與平等

[英]Object Identity and Equality in Java

請看下面的兩個例子:

String a = new String("hello");
String b = new String("hello");
System.out.println("a.hashCode() - " + a.hashCode());
System.out.println("b.hashCode() - " + b.hashCode());
System.out.println("a == b - " + (a == b));
System.out.println("a.equals(b) - " + (a.equals(b)));

結果:

a.hashCode() - 99162322
b.hashCode() - 99162322
a == b - false
a.equals(b) - true

如果我理解正確,我有2個不同的對象,因為單詞new創建了對象。 但是我們看到hashCode是相同的,這意味着我錯了。 如果hashCode是相同的,我理解為什么a.equals(b)True

但是這段代碼的輸出:

int [] a = {1, 2, 3};
int [] b = {1, 2, 3};
System.out.println("a.hashCode() - " + a.hashCode());
System.out.println("b.hashCode() - " + b.hashCode());
System.out.println("a == b - " + (a == b));
System.out.println("a.equals(b) - " + (a.equals(b)));

是不同的:

a.hashCode() - 1627674070
b.hashCode() - 1360875712
a == b - false
a.equals(b) - false

現在我們有兩個不同的對象,因為hashCode是不同的,這就是為什么兩個條件都是False (它應該是這樣)的原因。

感覺我需要填補知識空白,並會欣賞任何指導。

提前致謝!

這里感知的問題在於你對hashCode -method和數組的equals方法的理解。

hashCode方法可以在Object中找到,並將根據對象引用創建一個哈希。

String類使用自己的邏輯基於對Stringchar進行的計算來覆蓋此方法(更准確地說,它使用公式s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]計算哈希值s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]其中s[i]Stringi個字符)。 這意味着對於彼此equal 2個Strings ,您將始終通過調用hashCode獲得相同的結果。

int[]改為使用Object的實現,因此從對象引用創建哈希。 這意味着對於具有相同值的2個數組,您仍然可以通過調用hashCode獲得不同的結果。

另外,為了比較兩個數組的值,使用Arrays.equals作為調用int[].equals Arrays.equals與使用==運算符相同 - 再次 - 用於參考比較。 Arrays.equals反而在數組中的每個元素上調用equals方法,並根據它們的相等性返回結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM