嘿,我正在学习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);
答案 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
方法,或者它的实现方式与逐个元素的比较不同。