HashSet操作集合(重写hashCode&equals) 您所在的位置:网站首页 hashCode方法重写 HashSet操作集合(重写hashCode&equals)

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

2024-06-20 12:46| 来源: 网络整理| 查看: 265

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

问题描述

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

解题思路

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

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

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

注意:

需要使用英文状态下的符号;字符中间不要包含空格,否则会影响本次挑战的正确率。

在 Student 类中重写 hashCode() 和 equals() 方法,才能保证不会录入重复数据。

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

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

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

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

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

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

我的代码

这是定义的一个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 students=new HashSet(); 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 hs){ for(Student s:hs){ System.out.println(s.toString()); } } } 实验结果

图片描述

遇到的问题及解决办法

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有