本文介紹了為什么這個(gè).equals()代碼示例返回&q;False&q;?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
考慮:
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中默認(rèn)情況下,即使所有對(duì)象具有相同的值,也不是所有對(duì)象都相等,那么我如何才能說服Java相信這兩個(gè)對(duì)象實(shí)際上是相等的?
好的,即使兩只狗的名字、身高、體重相同,一只可能是斑點(diǎn)斗牛犬,另一只可能是斗牛犬,即使它們是同一種族,它們?cè)谧匀唤缰幸部赡芸偸遣煌摹?/p>
ps:我的理解是,if(one==Two){}我們比較的是它們是否都引用堆上的同一對(duì)象,.equals字符串的.equals比較它們是否具有相同順序的相同字符。
推薦答案
默認(rèn)情況下,equals方法會(huì)說”這是內(nèi)存中的同一對(duì)象嗎?”除非您覆蓋它。
您沒有覆蓋它。
行為未更改。
您需要添加如下所示的新方法
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提出了一個(gè)很好的觀點(diǎn)–永遠(yuǎn)、永遠(yuǎn)、永遠(yuǎn)不實(shí)現(xiàn)等于沒有hashCode。始終在兩者中使用相同的字段。
public int hashCode() {
int hash = name.hashCode();
hash = hash * 31 + weight;
hash = hash * 31 + height;
return hash;
}
這篇關(guān)于為什么這個(gè).equals()代碼示例返回&q;False&q;?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,