iT邦幫忙

0

Java hash table containsKey

想問 為何第一個的結果是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));

    }

}

havenhaven
iT邦見習生 ‧ 2021-09-20 20:20:14
【**此則訊息已被站方移除**】
0
theRookie
iT邦新手 3 級 ‧ 2021-09-20 20:34:35

這原理跟你比較下面這段會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);
        }
    }
theRookie iT邦新手 3 級 ‧ 2021-09-20 20:35:29 檢舉

這個用在set判斷什麼樣的物件叫重複也是一樣的

感謝

0
Hankz
iT邦新手 3 級 ‧ 2021-09-20 22:35:52

為何第一個的結果是false?

JAVA物件的比對(equals)
沒有特別去override的話
通常就是by reference
也就是比對記憶體中的位置編號
當你每次

a= new Item("AA","AA");

的時候
記憶體就會新增一個位置
所以你new了兩次Item
這兩個Item記憶體位置就不一樣
所以比對結果是False

要結果一是true的話 要怎改?

請直接參考theRookie大大的答案

感謝

我要發表回答

立即登入回答