Java 类与等式

Java 类与等式,java,Java,根据类的javadoc 每个数组也属于反映为类的类 对象,该对象由具有相同元素类型和 尺寸的数量 但是当我运行下面的 int[] intArray = { 1, 2 }; out.println(intArray.getClass().hashCode()); int[] int2Array = { 1, 2 }; out.println(int2Array.getClass().hashCode()); out.println(intArray.equals(int2Array)); 我得

根据
类的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
类型且维度相同,equals仍返回false。

这是因为您调用的是数组实例本身,而不是它们的
对象。尝试:

out.println(intArray.getClass().equals(int2Array.getClass())); //prints true
你也可以写:

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

另一方面,匹配的哈希代码不一定表示相等,尽管这在这里并不重要。

尝试调用
intArray.getClass().equals(int2Array.getClass())
通常,Java哈希代码契约只要求:

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

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


另外,请注意,如果使用而不是,则代码将正常工作,如下所示。注意,检查“两个数组包含相同数量的元素,并且两个数组中所有对应的元素对都相等。”


有关工作示例,请参阅。

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

如果您想测试两个数组的内容是否相等,那么
java.util.arrays
中有一些helper方法

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

equals()
的默认实现由以下内容定义:

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


当您使用
equals()
比较两个数组时,将调用其默认方法。

运行此操作,答案将很清楚:

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());

如果需要,还有Arrays.deepEquals方法。
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());