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对象。
热门推荐
游戏后台开发技术全面解析
崩坏星穹铁道新角色云璃爆料:物理输出的狐人少女
什么是财政赤字?如何影响市场预期?
有氧运动的多样选择与健康益处解析
公司给了offer后又不录取了怎么赔偿
上吐下泻?来看这份诺如病毒防控提示
大豆变油的方法步骤:揭秘大豆油的榨取过程
仕通学堂:国考经验谈,如何制定科学的备考计划
狐尾栗萃取物的三大功效:让头发更加丰盈与健康!
“男性必备:五大健康生活习惯,让你远离疾病困扰”
AI带你看古人过清明有多讲究
蚊子是人类健康的巨大威胁,但其在生态系统中也扮演着重要角色
种草坪怎样整地
如何实现FTP服务器的省电优化?
变速箱在新能源汽车中的演变:从传统到电动的跨越
算法如何评估
《我的世界》联机攻略:轻松与朋友共享游戏乐趣和冒险体验
如何利用台阶进行健身锻炼
【提醒】健康的小便是什么样的?快看看自己的尿液是否符合要求→
补牙要去几次才能弄好
补牙是否需要多次就诊?了解补牙过程的时间安排与频率。
《搞笑新闻:轻松一刻,笑看天下》
凯美瑞VS雅阁,谁才是B级车性价比之王?
鼻窦炎的治疗方法有哪些
梦见黑狮子是什么征兆
2025全球人口突破80亿:增长趋势与未来展望
知识产权专业求职者怎样写好工作经历
出海企业该如何制定合理战略规划?
懂车帝30款车"安全大碰撞"测试引发争议,专家:应关注卡车防护栏安全
冷水浴的好处