HashSet操作集合(重写hashCode&equals)

15 篇文章 0 订阅
1 篇文章 0 订阅

为什么要重写hashCode和equal方法?
1.hashset不允许有重复的元素,当加入一个元素时,hashset要先判断集合中是否包含这个元素,如果包含那么返回false,如果不包含那么加入进去返回true
(1)那么如何判断两个元素是否相等呢?
* 首先先判断连个元素的hashCode值是否一样,若hashCode值一样,则说明两元素相同返回fasls,如果hashCode不一样则可能不相同*
(2)然后再判断equal是否为真,若为真则两元素相同
那么为什么不直接判断eauqal呢?
判断hashCode所计算的次数少,因为一个元素的hashCode只用计算一次
-----------------------------------------------------------------------------------------------------------------------
以下是一个具体的案例,包含重写hashCode和equal方法

  1. 问题描述

    指定放入 HashSet 集合中的元素类型必须为 Student ,不能存在重复元素,需要在 Student 类中重写 hashCode()equals() 方法才能实现功能,如果忘了如何重写这两个方法,建议回头再去看一下之前 2.2 Set 接口章节中重写 hashCode()equals() 方法的课程知识内容,才能完成本次挑战。

  2. 解题思路

    1. Student 类中需要提供两个 String 类型的属性: name 学生姓名和 grade 学生年级,分别提供相应的 getset 方法;

    2. Student 类中需要重写 toString() 方法,便于学生信息的输出,并需要按以下结构输出:?

      Student:name=小桃子,grade=三年级
      

      注意:

      • 需要使用英文状态下的符号
      • 字符中间不要包含空格,否则会影响本次挑战的正确率。
    3. Student 类中重写 hashCode()equals() 方法,才能保证不会录入重复数据。

    4. StudentService 类中添加 addStudent() 方法,在方法中将 Student 学生信息存储到 HashSet 集合中,Student 对象添加到 HashSet 任务完成方法返回 true ,如果出现异常则返回 false,以下是提供录入学生信息,必须按照提供的信息录入,否则会影响挑战无法正确通过。

      new Student("张三","一年级")
      new Student("李四","二年级")
      new Student("小桃子","三年级")
      new Student("张三","一年级")
      

      ?注意:最后一个学生信息应该是无法存储到集合中的。

    5. StudentService 类中添加 showStudent() 方法,方法中采用 foreach 循环方式进行数据元素遍历,并进行打印输出。

    6. StudentServicemain 方法中调用 addStudent() 方法后需要打印出相应信息,方法调用后返回值为 true 时返回字符串 “学生信息录入成功” ,返回值为 false 时返回字符串 “学生信息录入失败”。

    7. 输出的信息必须按照要求内容要求进行书写,不能随意扩展。

  3. 我的代码

这是定义的一个Student的类,在这里面重写equal和hashCode方法
用于比较放个对象是否相同

public class Student {
    private String name;
    private String grade;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }
    public String toString() {
        String result="Student:name="+name+",grade="+grade;
        return result;
    }
    @Override
    public int hashCode() {
        return name.hashCode()+grade.hashCode();
    }
    
    @Override
    public boolean equals(Object obj) {
        if(this==obj){
            return true;
        }
        else if(obj instanceof Student){
            Student s=(Student)obj;
            if(name.equals(s.getName())&&grade.equals(s.getGrade())){
                return true;
            }
            else{
                return false;
            }
        }else{
            return false;
        }
        
    }
    
}

import java.util.HashSet;

public class StudentService {
    static HashSet<Student> students=new HashSet<Student>();
    public static void main(String[] args) {
        if(addStudent()){
            System.out.println("学生信息录入成功");
        }else{
            System.out.println("学生信息录入失败");
        }
        showStudent(students);
    }
    public static Boolean addStudent(){
        
        students.add(new Student("小桃子","三年级"));
        students.add(new Student("张三","一年级"));
        students.add(new Student("李四","二年级"));
        students.add(new Student("张三","一年级"));
        if( students.contains(new Student("张三","一年级"))&&
            students.contains(new Student("李四","二年级"))&&
            students.contains(new Student("小桃子","三年级"))
        )
        {
            return true;
        }
        else{
            return false;
        }
    }
    public static void showStudent(HashSet<Student> hs){
        for(Student s:hs){
            System.out.println(s.toString());
        }
    }
}

  1. 实验结果

图片描述

  1. 遇到的问题及解决办法

hashCode和equal方式是重写方法记得加上override以免出错,重写的方法体,参数列表是不可以改的

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用HashSet时,如果要将自定义对象作为元素存储在其中,则需要重写该对象的hashCode()和equals()方法。 hashCode()方法用于确定元素的哈希值,用于在HashSet中确定元素的位置。 equals()方法用于比较两个元素是否相等。如果两个元素的hashCode()值相同,则会调用equals()方法来确定它们是否相等。 重写这两个方法的规则如下: - hashCode()方法: 1. 在同一对象中多次调用hashCode()应该返回相同的整数。 2. 如果equals()比较两个对象相等,则它们的hashCode()返回值应该相同。 3. hashCode()返回值不一定唯一,不同对象可能会返回相同的整数。 - equals()方法: 1. 自反性: 对于任何非空引用x,x.equals(x)应该返回true。 2. 对称性: 对于任何非空引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)也应该返回true。 3. 传递性: 对于任何非空引用x,y,z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true。 4. 一致性:对于任何非空引用x和y,多次调用x.equals(y)应该始终返回相同的结果在使用HashSet的时候,为了保证对象的唯一性,需要重写对象的hashCodeequals方法。 hashCode方法用于生成对象的哈希码,HashSet在添加对象时会使用该哈希码来判断对象是否重复。 equals方法用于判断两个对象是否相等。如果重写hashCode方法,一般也要重写equals方法。 重写这两个方法时,需要遵循以下规则: 1.如果两个对象相等,那么它们的hashCode值一定相等。 2.如果两个对象的hashCode值相等,那么它们不一定相等。 3.equals方法需要遵循传递性,对称性和自反性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值