java.lang.Class和相等

时间:2011-12-12 19:24:05

标签: java

根据Class

的javadoc
  

每个数组也属于一个反映为Class的类   由具有相同元素类型的所有数组共享的对象   尺寸数量。

但是当我运行下面的

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类型且具有相同的维度,equals也会返回false。

6 个答案:

答案 0 :(得分:8)

这是因为您在数组实例本身而不是Class对象上调用了equals()。尝试:

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

你也可以写:

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

顺便说一下,匹配的哈希码并不一定表示相等,但这并不重要。

答案 1 :(得分:3)

尝试拨打intArray.getClass().equals(int2Array.getClass())

答案 2 :(得分:2)

通常,Java哈希码合约只需要:

  
      
  • 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。
  •   
  • 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。
  •   
  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
  •   

(来自the Java documentation on Object#hashCode

这里有两个不相等的整数数组(例如a.equals(b) => false),但它们(参见第三点)返回不相等的哈希码。


另请注意,如果您使用Arrays.equals而非Object#equals,则代码将有效,如下所示。请注意,Arrays.equals检查“两个数组包含相同数量的元素,并且两个数组中的所有对应元素都相等。”

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

答案 3 :(得分:1)

您正在比较两个不同的阵列。数组相等性基于标识,而不是数组内容。由于它们不是同一个数组,因此结果是错误的。

如果要测试两个数组的内容是否相等,java.util.Arrays中有辅助方法。

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

答案 4 :(得分:0)

equals()的默认实现由Object.equals(Object)定义:

  

类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

使用equals()比较两个数组时,会调用默认方法。

答案 5 :(得分: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());