集合---自定义HashSet的去重方法

这篇博客探讨了如何在HashSet中实现基于学生学号和姓名相等的去重策略,而非依赖对象地址。通过创建Student类并重写equals()和hashCode()方法,使得在插入HashSet时,只有当学号和姓名都相同的对象才会被视为重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要重写的 场景:

HashSet对 对象地址相同 的对象 去重。

但 现在我们规定:
当学生的学号、姓名都相等时,认为 学生对象 相等 【不一定需要对象地址相同】

1.创建Student类:

public class Student {
    private String name;
    private Integer code;

    public Student(String name, Integer code) {
        this.name = name;
        this.code = code;
    }
    public Student() { }

    //在测试类 可打印出以下内容
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", code=" + code +
                '}';
    }

/*因为所有的java类都讲继承Object类,而且是当该类没有继承父类的时候,默认继承Object类为父类;
并且Object类中是存在hashCode的方法和equals方法的,子类和父类Object中的方法一致,所以叫重写 */
/*
自定义去重规则=重写hashset中的2个方法

        去重学号相同的 学生
 */

    //    重写hashcode方法------仅hashcode返回的int相同时,才会调用equals方法
    @Override
    public int hashCode() {
        //此处要求: 学号不重复、姓名不重复

        //返回 当前对象的学号
        return code;

        //如果是对 名字=字符串 去重
        //return name.hashCode();//每个字符串都有hashCode

        //名字  和  学号  加起来的返回值int
        //return name.hashCode()+code;

        //网上的算法 ,不理解
        //final int prime = 31;
        //int result = 1;
        //result = prime * result + id;
        //result = prime * result + ((name == null) ? 0 : name.hashCode());
        //return result;

        //返回恒定值,使每个对象有同样的hashcode,则一定执行equals方法
        //return 10;
    }


    /*
         重写equals方法=2个对象(参数obj和this)的比较 :   返回值  true相同--去掉    false不同--留下
            2个判断
                1.参数obj 是否为 Student的实例
                2.自定义去重判断语句
     */
/*
	当以上hashcode直接恒return 10;  =恒一定会调用equals方法时:
	equals会被调用执行=比较几次?
*/
    @Override
    public boolean equals(Object obj) {

        //是否为 同1个类or其子类创建的 对象
        if(!(obj instanceof Student)) {//不是同1个类Student  没可比性
            // instanceof 已经处理了obj = null的情况
            return false;
        }

        //运行到此处  一定是Student类创建的对象
        //转为Student对象
        Student stuObj = (Student) obj;

        // 如果两个对象学号、姓名相等,我们认为两个对象相等
        //由于hashcode方法已比较学号,此处可省略学号判断
        //stuObj.code==this.code &&
        if (stuObj.name.equals(this.name) ) {
            return true;
        } else {
            return false;
        }
    }

}

2.测试类 走起:

public class test {
    public static void main(String[] args) {
        Student s1 = new Student("小花", 2);
        Student s2 = new Student("小花", 2);
        Student s3 = new Student("大黄", 7);

        HashSet<Student> students = new HashSet<>();
        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(null);

        for (Student student : students) {
            System.out.println(student);
        }

    }
}

运行结果:
在这里插入图片描述
当hashcode返回10为定值,equals方法恒执行,
后面进去的人,
要跟前面已经进去的人 ,
依次握手。(相当于说 除了第一个进去的人不用)

依次递增,相加为和 = equals共执行次数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值