HashSet的一道经典面试题

写一个Person类,有name和id两个属性,并且实现了hashCode和equals方法,请写出测试类中代码的输出结果:

import java.util.HashSet;

class Test{
    public static void main(String[] args) {
    	//重写了hashCode()和equals() 方法
        HashSet set = new HashSet();
        Person p1 = new Person(1001, "AA");
        Person p2 = new Person(1002, "BB");
        set.add(p1);
        set.add(p2);
        System.out.println(set);
        p1.setName("CC");
        set.remove(p1);
        System.out.println(set);
        set.add(new Person(1001,"CC"));
        System.out.println(set);
        set.add(new Person(1001,"AA"));
        System.out.println(set);
    }
}


输出结果为:
[Person{id=1002, name='BB'}, Person{id=1001, name='AA'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]


HashSet存放数据的方式是通过hashCode()计算哈希值来比较的,如果哈希值不同就能比较,如果哈希值相同那么再用equals()的方法来进行比较。

  • 首先,用已经复写好的hashCode()方法来计算出第一个Person对(1001,“AA”)所对应的哈希值a,再计算第二个Person对象(1002,“BB”)所对应的哈希值b,那么第一个结果就是:

[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘AA’}]

  • 接着,注意一个操作:p1.setName(“CC”)
    此时,第一个对象的哈希值还是a,存储位置不变,只是改变了name的属性值,而原本的数据中没有(1001,“CC”)所对应的哈希值,所以调remove()方法的时候没有找到想要的这个对象 故第二个结果为:

[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘CC’}]

  • 然后,再创建(1001,“CC”)这个对象并计算它的哈希值c,故结果有3个

[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘CC’}, Person{id=1001, name=‘CC’}]

  • 最后,又创建了一个对象(1001,“AA”),它的哈希值为a,很显然与前面的重复了,那么这时就要调用equals()方法来比较了此时,第一个对象的姓名为CC,而此时的第四个对象为AA,故两个对象通过equals()方法得到两个对象不一样,所以可以加入,即第四个结果为:

[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘CC’},
Person{id=1001, name=‘CC’}, Person{id=1001, name=‘AA’}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuZhan7710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值