问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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对象。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号