2011-12-12 48 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());