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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么输出"假"?如果Java默认情况下"所有对象即使它们具有相同的值也不相等"那么我如何"说服"Java这两个对象实际上是相等的?好吧,即使两只狗有相同的名字,身高,体重也可以是dalmatiner而另一只是斗牛犬,即使它们是相同的"种族",在性质上,它们总是彼此不同.
PS:我理解通过说if(one == two){}我们比较它们是否都引用堆上的相同对象,字符串上的.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;
}
Run Code Online (Sandbox Code Playgroud)
斯蒂芬提出了一个很好的观点 - 永远不会,没有hashCode,所以永远都没有.始终在两者中使用相同的字段.
public int hashCode() {
int hash = name.hashCode();
hash = hash * 31 + weight;
hash = hash * 31 + height;
return hash;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
335 次 |
| 最近记录: |