关于set的一道面试题

本文讨论了在使用Set(如HashSet、LinkedHashSet)时,如何确保Person类对象正确添加和删除,关键在于重写hashCode和equals方法的一致性。通过实例展示了当对象属性改变时对哈希值的影响,以及如何避免重复添加和误删。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仅用于个人学习

注意事项:

1.向Set(主要指:HashSet、LinkedHashSet)中添加的数据,其所在的类一定要重写hashCode()和equals()
2.重写的hashCode()和equals()尽可能保持一致性:即相等的对象必须具有相等的散列码(哈希值)

如图:

解答:

HashSet set = new HashSet();
 Person p1 = new Person(1001,"AA");
 Person p2 = new Person(1002,"BB");
 set.add(p1);
 set.add(p2);
 p1.name = "CC";// 此时p1的hashCode不发生改变
 set.remove(p1);// p1的hashCode值经过修改后,此时拿p1(修改后的)与set中所对应p1的hashCode值比较,删除了一个null值。
System.out.println(set); 
set.add(new Person(1001,"CC")); //添加成功,对应的hashcode中没有对象
System.out.println(set);
 set.add(new Person(1001,"AA")); //添加成功虽然hashcode与p1相同但equals方法不相同,以单链表的形式存在(七上八下)
System.out.println(set);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值