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对象。
热门推荐
隆美尔:纳粹德国的“帝国之鹰沙漠之狐”,争议与传奇并存的人生
为什么新车现在都加0W-20,甚至粘度更低的机油,你知道原因吗?
购买外国特效药的合法性及法律风险分析
感冒好多种,如何选择合适的中成药?
LK-99“室温超导”假象源自Cu2S一级结构相变
非洲中医行业分析
掏耳朵不小心碰里面出血了怎么办
2024年中国麝香行业产销量、市场规模及发展前景分析[图]
WTT常规挑战赛马斯喀特站国乒包揽五冠
对狗狗好的蔬菜有哪些
维生素B6的作用及功能治疗失眠
玉米煮多久能熟 煮玉米是冷水下锅还是热水下锅
口说爱语可助我们摄化众生
QQ怎么删除聊天记录?QQ聊天记录存储位置及删除方法详解
最多可选45个平行志愿!新高考填志愿让人头大?记住这三句通用规则
滚动轴承的损伤分类都有哪些你知道吗?
李嗣源临死前,准太子为何会起兵,要想夺取皇位?
战略变革不翻车,这份公式请收好
中国CS战队WNV总共拿过几次世界\*?盘点中国FPS电竞辉煌成就
六W两H分析法解析:问题解决与决策的实用工具
人可以吃狗粮吗?
满清入关后采取了哪些政策来镇压汉人?
不会和孩子聊天?试试苏格拉底式提问法,一问一答,让孩子更聪明
豌豆的营养价值与食用功效
《水浒传》水泊梁山首领宋江,历史上竟真有其人,结局却扑朔迷离
历史上的宋江结局是什么?正史和小说有何不同?
锂离子电池的8个关键参数
断网也能玩的单机游戏推荐(15款单机游戏让你在断网时不再无聊)
氯沙坦钾片要吃多久效果才好
不同年龄段的儿童该如何选择牙刷