考虑:
class Dog{
int height;
int weight;
String name;
}
public class DogTest {
public static void main(String[] args) {
Dog one = new Dog();
one.height=4;
one.name="fudo";
one.weight =2;
Dog two = new Dog();
two.height=4;
two.name="fudo";
two.weight =2;
if (one.equals(two)){
System.out.println("True");
}
else{
System.out.println("False");
}
}
}
为什么会输出“False”?如果在Java中默认情况下“所有对象都不相等,即使它们具有相同的值”,那么我如何“说服”Java这两个对象实际上是相等的?
好吧,即使两只狗有相同的名字、身高、体重,一只可能是达尔马提亚狗,另一只可能是斗牛犬,即使它们是相同的“种族”,但本质上,它们总是可以彼此不同。
PS:我的理解是这样说的如果(一==二){}我们正在比较它们是否都引用堆上的同一个对象,.equals在字符串上比较它们是否具有相同顺序的相同字符。
equals 方法默认会说“这是内存中的同一个对象吗?”除非你覆盖它。
你没有覆盖它。
行为没有改变。
您需要添加一个像这样的新方法
public boolean equals(Object o) {
if(o instanceof Dog) {
Dog d = (Dog)(o);
Dog t = this;
return t.height == d.height && t.weight == d.weight && t.name.equals(d.name);
}
return false;
}
Stephan 提出了一个很好的观点——永远、永远、永远不要在没有 hashCode 的情况下实现 equals。始终在两者中使用相同的字段。
public int hashCode() {
int hash = name.hashCode();
hash = hash * 31 + weight;
hash = hash * 31 + height;
return hash;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)