想問 為何第一個的結果是false? 要結果一是true的話 要怎改? 我的最終目標是 for loop asign value of a。 求指教
public class Test {
public static void main(String [] args){
Item a;
a= new Item("AA","AA");
Map<Item, Integer> map = new HashMap<Item, Integer>();
map.put(a,1);
a = new Item("AA","AA");
System.out.println(map.containsKey(a));
Item b = new Item("BB","BB");
System.out.println(map.containsKey(b));
}
}
這原理跟你比較下面這段會false一樣,如果沒有覆寫equals 與hashCode
那麼就是預設使用Object裡的equals 與hashCode
(String這個類會過是因爲原廠已經幫你寫好了)
Item c = new Item("AA","AA");
Item d= new Item("AA","AA");
System.out.println(c.equals(d));
因此可以使用Ide或者自己手動複寫這個兩個物件再怎麽樣的情況下會視爲相同
public class Item {
private String a;
private String b;
public Item(String a,String b) {
this.a = a;
this.b = b;
}
//下面開始是重點,這是用IDE自動生成的
//可以自己搜尋"java覆寫equals&hashCode"
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Item)) return false;
Item item = (Item) o;
return a.equals(item.a) &&
b.equals(item.b);
}
@Override
public int hashCode() {
return Objects.hash(a, b);
}
}
為何第一個的結果是false?
JAVA物件的比對(equals)
沒有特別去override的話
通常就是by reference
也就是比對記憶體中的位置編號
當你每次
a= new Item("AA","AA");
的時候
記憶體就會新增一個位置
所以你new了兩次Item
這兩個Item記憶體位置就不一樣
所以比對結果是False
要結果一是true的話 要怎改?
請直接參考theRookie大大的答案