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

时间:2011-12-05 22:26:52

标签: java

嘿,我正在学习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);

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

时,array == something为真

答案 3 :(得分:1)

数组隐式扩展Object类。因此,您的equals方法是从那里继承的。 equals方法的默认实现仅检查身份相等性,即与==相同。

答案 4 :(得分:1)

你是正确的==运算符仅比较引用相等性,因此第二和第三个print语句可以达到预期的效果。

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

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