数组的平等方法如何工作?

嘿,我正在学习Java决赛,我被一个简单的equals方法弄糊涂了。

给出的问题是

“鉴于以下数组声明,以下打印是什么”

并且我认为这是真的,错误的,但是在复制和粘贴代码之后,它显示答案是错误的,错误的,真实的。

我知道==只有在它们是对象的同一个实例时才有效,但我不明白为什么第一个是假的。 我尝试在数组api中找到该方法,但找不到具有相同参数的方法。

请原谅我,如果这是显而易见的,我在过去的几个晚上一直在学习,现在我对咖啡因感到厌倦。

 int[] d = { 1, 2, 3 }; int[] b = { 1, 2, 3 }; int[] c = d; System.out.println(d.equals(b)); System.out.println(d == b); System.out.println(d == c); 

基本上,数组类型不会覆盖equals以提供值相等…所以最终得到Object中的默认实现,即引用相等。

对于数组中的值相等(即相同顺序的相等元素),请使用Arrays类中的静态方法。

普通的Java数组(即,不是ArrayList或其他类似的)本身并不实现equals ,而是使用Object的实现。 这基本上只是一个地址比较。

(但请注意,java.util.Arrays为generics数组实现了一些静态equals方法。)

Array是一个Object,它不会覆盖Object.equals(),因此Object.equals()的标准实现适用。 当且仅当array == something array.equals(something)为真。

数组隐式扩展了Object类。 所以,你的equals方法是从那里inheritance的。 equals方法的默认实现只检查身份相等,即与==相同。

你是正确的, ==运算符只比较引用相等,所以第二和第三个打印语句做你期望的。

.equals方法可以通过除引用相等之外的其他方式进行比较,但这需要类定义实际实现该方法。 如果.equals未在数组类中实现,那么运行时将返回Object#equals ,这与使用==运算符找到的引用相同。

换句话说,似乎在数组的支持类中没有.equals方法,或者它的实现方式与逐个元素的比较不同。