猿问

请问在HashSet集合中存入同一对象,在哈希值相同情况下为什么没有调用equals方法呢?

Person类中重写了hashCode 跟equals方法,在HashSet集合中添加两次同一对象时在比较得知哈希值相等的时候为什么没有调用equals方法比较就认为元素已经存在了呢?

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());
        }
    }

}

结果:

test,21....hashCode3557065
test,21....hashCode3557065
test,21
拉丁的传说
浏览 516回答 4
4回答

Smart猫小萌

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

繁星coding

首先抛开底层实现来讲,讲道理如果你是两个new的对象,会先比较hashcode,再去比较equals没毛病,但是你这是同一个对象,放了两次,equals和hashcode重写的目的是比较值内容来实现去重,同一个内存地址肯定是同一个对象没有再次比较的必要,再从实现来讲,为什没有调用equals,估计要去看一下hashmap put方法的源码了

子衿沉夜

一楼潘金莲说的对

交互式爱情

hashcode()判断在堆中是否指向同一个地址,重写的equals()判断逻辑上是否相等。hashcode相等可以得出equals一点相等,反之不成立。
随时随地看视频慕课网APP

相关分类

Java
我要回答