HashSet重复对象不插入问题解决方案
创作时间:
作者:
@小白创作中心
HashSet重复对象不插入问题解决方案
引用
CSDN
1.
https://blog.csdn.net/m0_64458420/article/details/140337186
本文讨论了在使用Java的HashSet存储自定义对象时遇到的重复对象插入问题,并详细介绍了如何通过重写hashCode和equals方法来解决这一问题。
问题描述
在使用HashSet存储自定义的People对象时,发现即使创建了多个具有相同属性的对象,HashSet仍然会将它们都添加进去,这与HashSet不允许重复元素的特性相悖。
package com.sgu.test6;
public class People {
private String name;
private String age;
public People() {}
public People(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
package com.sgu.test6;
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<People> hs = new HashSet<>();
People p1 = new People("zhangsan", "21");
People p2 = new People("lisi", "22");
People p3 = new People("zhangsan", "21");
People p4 = new People("lisi", "22");
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
System.out.println("共有" + hs.size() + "个人");
}
}
原因分析
HashSet是基于HashMap实现的,它通过hashCode和equals方法来判断对象是否重复。对于Java提供的基本类型如String和Integer,它们已经实现了hashCode和equals方法,因此可以直接使用HashSet而不会出现重复元素。但对于自定义对象,需要手动重写这两个方法。
解决方案
在People类中重写hashCode和equals方法:
@Override
public int hashCode() {
return name.hashCode() + age.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else if (obj instanceof People) {
People p = (People) obj;
if (name.equals(p.getName()) && age.equals(p.getAge())) {
return true;
} else {
return false;
}
} else {
return false;
}
}
或者使用IDEA的快捷键Alt+Insert,选择equals() and hashCode(),让IDEA自动生成相关代码。
结果验证
经过上述修改后,再次运行HashSetTest类,可以看到HashSet正确地识别了重复对象,只存储了两个不同的People对象。
热门推荐
水产养殖新突破:胆汁酸可提高5%日增重,降低5%料肉比
北大医学团队发现新型胆汁酸修饰,揭示脂肪肝治疗新机制
胆汁酸代谢新发现:肠道菌群调控机制获揭示
日本放宽老年游客签证:3年多次往返,5天快速审批
超半数大学生零点后入睡,长期熬夜影响身心健康
——2024中国睡眠研究会白皮书
多地推行15分钟课间制,校长:拖堂、安全等难题如何破?
揭秘美国校园体育:三大运动如何塑造学生全面发展
安全舒适游北海道:老年人6天5夜全程攻略
亚龙湾:天下第一湾的绝美探秘
太行山大峡谷摄影大赛,你准备好了吗?
太行山大峡谷:打卡地质奇观的网红地
王莽岭:一个承载千年传说的太行明珠
太行山大峡谷徒步攻略:涉县最美线路详解
太行山大峡谷一日游攻略:三大景区特色详解
林定坤工作室推荐:泡脚方配合锻炼,轻松缓解足跟痛
办公室人群如何预防和缓解足跟痛?
足底筋膜炎的科学治疗指南
便携吉他:让音乐与你同行
弹吉他:开启身心健康的新篇章
十月自驾西藏:318国道成都至拉萨全程攻略
G219边境公路:多元地貌中的舒适露营地指南
高度近视患者献血有风险,专家建议600度以上者谨慎参与
高血压、高度近视患者不宜献血,医生详解风险原因
头晕口疮便秘?牛黄清胃丸帮你缓解胃火症状
牛黄清胃丸:清胃泻火功效好,孕妇禁用遵医嘱
“未病检测”成亮点,日本温泉旅游助力老年健康管理
富士山吉田路线:老年人轻松登顶,还有专业讲解服务
七成客户是老年人,这家旅行社如何精准满足银发族旅游需求
高纤维饮食增强免疫力,青少年这样预防灰指甲
清洁、剪指甲、均衡饮食:预防宝宝灰指甲全攻略