HashSet重复对象不插入问题

题目:定义人类,包含姓名和年龄属性。创建4个人存储到HashSet中,姓名和年龄相同的人看做同一人不存储。
#people.java
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;
    }
}





#HashSetTest.java
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 来实现的,是一个不允许有重复元素的集合吗?

我找了菜鸟教程,案例也显示结果是不会添加重复元素的,如下图:

原因:

这是因为HashSet存储的对象是我们自定义的People,想要重复对象不插入,需要重写hashCode和equals方法。

那为什么菜鸟教程里面的实例不用呢?

这是因为String和Integer类型是Java提供的,已经写好了,所以不需要重写hashCode()和equals()也可以不增加重复数据。

我们在idea中Ctrl+N,搜索String类并打开,

(记得是java.lang包下面的,没有的话把搜索条件改为All Places)

可以看到:

可以看到String类在Java中已经写好了hashCode()和equals()。

解决

1、在people.java文件中添加上下面的代码:

 @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;
        }

    }

2、或者,在People.java中,按Alt+Insert,选择equals() and hashCode(),idea自动添加

解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值