2011-12-12 42 views
6

據的Classjava.lang.Class中和平等

每個數組也屬於被反射作爲由具有相同的元素類型和數量 所有陣列共享一類 對象的類的Javadoc尺寸。

但是當我運行下面的

int[] intArray = { 1, 2 }; 
out.println(intArray.getClass().hashCode()); 
int[] int2Array = { 1, 2 }; 
out.println(int2Array.getClass().hashCode()); 

out.println(intArray.equals(int2Array)); 

我得到下面的輸出

1641745 
1641745 
false 

我很奇怪,爲什麼即使兩個陣列int類型和平等是返回false具有相同的尺寸。

回答

8

這是因爲您在數組實例本身上調用equals()而不是它們的Class對象。嘗試:

out.println(intArray.getClass().equals(int2Array.getClass())); //prints true 

你也可以這樣寫:

out.println(int[].class.equals(int[].class)); //prints true thankfully 

順便說一句,匹配的散列碼並不一定意味着平等,但不要緊這裏。

3

嘗試調用intArray.getClass().equals(int2Array.getClass())

2

在一般情況下,Java的哈希碼的合同只規定:

  • 每當它是一個Java應用程序的執行期間,在同一對象不止一次調用,只要修改了對象的等號比較中使用的信息,hashCode方法就必須始終返回相同的整數。該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。
  • 如果兩個對象根據equals(Object)方法相等,則對這兩個對象中的每個對象調用hashCode方法必須產生相同的整數結果。
  • 根據equals(java.lang.Object)方法,如果兩個對象不相等,則不要求對兩個對象中的每個對象調用hashCode方法必須產生不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同的整數結果可能會提高散列表的性能。

(從the Java documentation on Object#hashCode

在這裏,你有兩個整型數組不相等(例如a.equals(b) => false),但他們不(參見第三點)返回不平等的哈希碼需要。


另外請注意,您的代碼將工作,如果你使用Arrays.equals而不是Object#equals,如下所示。請注意0​​檢查「兩個數組都包含相同數量的元素,並且兩個數組中的所有相應元素對都相等。「

int[] intArray = { 1, 2 }; 
out.println(intArray.getClass().hashCode()); 
int[] int2Array = { 1, 2 }; 
out.println(int2Array.getClass().hashCode()); 

out.println(Arrays.equals(intArray, int2Array)); 

的工作示例見http://www.ideone.com/HaysD

1

你比較兩個不同的陣列。陣列平等基礎上的身份,而不是陣列的內容。由於他們是不一樣的陣列,結果是假的。

如果你想測試兩個數組相等的內容,也有輔助方法在java.util.Arrays

out.println(Arrays.equals(intArray, int2Array); 
+0

另外還有Arrays.deepEquals方法,如果你需要他們。 –

0

的的equals()默認實現由Object.equals(Object)定義:

的等於Object類方法實現對象上差別可能性最大的等價關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

當您使用equals()比較兩個陣列時,將調用默認方法。

0

運行這一點,答案是明確的:

int[] array1 = { 1, 2 }; 
int[] array2 = { 1, 2 }; 

System.out.println("array1.hashcode: " + array1.hashCode()); 
System.out.println("array2.hashcode: " + array2.hashCode()); 
System.out.println("array1.class.hashcode: " + array1.getClass().hashCode()); 
System.out.println("array2.class.hashcode: " + array2.getClass().hashCode());