鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ 請問在HashSet集合中存入同一對象,在哈希值相同情況下為什么沒有調(diào)用equa

請問在HashSet集合中存入同一對象,在哈希值相同情況下為什么沒有調(diào)用equals方法呢?

Person類中重寫了hashCode 跟equals方法,在HashSet集合中添加兩次同一對象時在比較得知哈希值相等的時候為什么沒有調(diào)用equals方法比較就認(rèn)為元素已經(jīng)存在了呢?

public class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    get、set方法省略...
    @Override
    public int hashCode() {
        int hashCode = this.name.hashCode() + this.age * 27;
        System.out.println(this + "....hashCode" + hashCode);
        return hashCode; 
    }
    @Override
    public boolean equals(Object obj) {
        Person p = (Person) obj;
        System.out.println(this + "...equals..." + p);
        return this.name.equals(p.name) && this.age == p.age;
    }
    @Override
    public String toString() {
        return this.name + "," + this.age;
    }

測試類代碼:

public class HashSetTest {

    public static void main(String[] args) {
        HashSet hs = new HashSet();
        Person ps = new Person("test", 21);

        hs.add(ps);
        hs.add(ps);

        for (Iterator it = hs.iterator(); it.hasNext(); ) {
            Person p = (Person) it.next();
            System.out.println(p.getName() + "," + p.getAge());
        }
    }

}

結(jié)果:

test,21....hashCode3557065
test,21....hashCode3557065
test,21
回答
編輯回答
焚音

hashcode()判斷在堆中是否指向同一個地址,重寫的equals()判斷邏輯上是否相等。
hashcode相等可以得出equals一點相等,反之不成立。

2018年7月11日 11:38
編輯回答
空痕

if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))
兩次操作的是同一個對象,后面的equals方法被短路了

2017年5月10日 17:00
編輯回答
久舊酒

一樓潘金蓮說的對

2018年2月23日 15:41
編輯回答
詆毀你

首先拋開底層實現(xiàn)來講,講道理如果你是兩個new的對象,會先比較hashcode,再去比較equals沒毛病,但是你這是同一個對象,放了兩次,equals和hashcode重寫的目的是比較值內(nèi)容來實現(xiàn)去重,同一個內(nèi)存地址肯定是同一個對象沒有再次比較的必要,再從實現(xiàn)來講,為什沒有調(diào)用equals,估計要去看一下hashmap put方法的源碼了

2018年9月11日 20:50