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对象。
热门推荐
MBTI中FI是什么意思
Fi型人格的特点、表现、挑战与整体评价以及和Fe功能的区别
特色中餐馆风格设计如何融合地域文化
消防主题公园标识立牌的设计制作种类有哪些?
个人贷款条件及申请流程简介
品牌和产品在中国本土化过程中的诸多考虑维度
律师作用和重要性
PyTorch深度学习框架实战:torchrun分布式训练详解
如何查看自己的养老金账户
《诗经·蒹葭》赏析,其凄婉缠绵的情致像郑卫之音的风格
16 种常见白内障图解
武陵春——探寻李清照的生命韵律与诗意表达
【无障碍网页设计】:为悬浮菜单添加无障碍访问功能
人人能看得懂的“借贷记账”法
甲状腺癌筛查指南:方法与意义全解析
甲状腺癌怎么治疗比较好
犬瘟热会传染人吗
狗狗为什么会得犬瘟?了解犬瘟热的传播与预防措施
夏日临夏、武隆游玩攻略来了!体验亲子旅行、亲临电影取景地!
新能源车与传统车保养有啥不一样
老中医详解十穴位治病图解,易学实用,建议收藏~
家用监控系统的功能剖析
南宁青秀山:秋日里的自然人文之旅
如何预防急性肾衰竭的发生?
干湿球湿度计的基本构造与工作原理
湿度计原理与应用:从传统到智能的湿度测量技术
小苏打洗脸美白,是真的吗
沙门菌的症状有哪些
孩子的身高预测准确性如何
为何睡眠时会出现腘窝出汗