老师,请问下为什么我重写了equals方法后,还是会出现重复数据。因为之前的课程视频说hashCode方法是默认的不需要重写,所以我没重写,是不是跟这点有关呢

老师,请问下为什么我重写了equals方法后,还是会出现重复数据。因为之前的课程视频说hashCode方法是默认的不需要重写,所以我没重写,是不是跟这点有关呢

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

public class StudentTest {

    public static void main(String[] args) {

//定义三个Student类的对象及一个HashSet类的对象

        Student s1 = new Student(1,"Tom",87.0f);

        Student s2 = new Student(2,"Lucy",95.0f);

        Student s3 = new Student(3,"William",65.0f);

        Set set = new HashSet();

//将Student类的对象添加到集合中

set.add(s1);

set.add(s2);

        set.add(s3);

        

//使用迭代器显示Student类的对象中的内容

Iterator it = set.iterator();

while(it.hasNext()){

    System.out.println(it.next());

}

//添加重复数据到Set中

System.out.println("**********************");

System.out.println("添加重复数据后的输出结果");

Student s4 = new Student(2,"Lucy",95.0f);

set.add(s4);

it = set.iterator();

while(it.hasNext()){

    System.out.println(it.next());

}

    

    

}

}


public class Student{

   //根据需求完成Student类的定义

   private int stuld;//学号

   private String name;//姓名

   private float score;//成绩

   //默认构造方法

   public Student(){

       

   }

   //带参构造方法

   public Student(int stuld,String name,float score){

       this.setStuld(stuld);

       this.setName(name);

       this.setScore(score);

   }

   //getter和setter方法

   public int getStuld(){

       return stuld;

   }

   public void setStuld(int stuld){

       this.stuld = stuld;

   }

   public String getName(){

       return name;

   }

   public void setName(String name){

       this.name = name;

   }

   public float getScore(){

       return score;

   }

   public void setScore(float score){

       this.score = score;

   }

   //重写toString方法

   public String toString(){

       return "[学号:"+stuld+",姓名:"+name+",成绩:"+score+"]";

   } 

   //重写hashCode方法

   

   //重写equals方法

   public boolean equals (Object obj){

       if(obj == this)

       return true;

       if(obj.getClass()==Student.class){

           Student stu = (Student)obj;

           return stu.getStuld() == stuld && stu.getName().equals(name) && stu.getScore() == score;

       }

       return false;

   }

}

相关截图:

https://img1.sycdn.imooc.com//climg/6184a4d1097d4ebc04640234.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学您好,

之所以重复是因为hashCode()是根据对象地址生成的,每个new出来的对象的地址值是不同的。如果不重写hashCode方法,默认返回的是根据该对象地址生成的哈希码值。每个对象的hashCode()值都不一样,所以每个对象都不会相等,从而导致重复添加。所以建议重写hashCode()方法

祝同学学习愉快~

  • 大东2022 提问者 #1

    有点疑惑,我以为是我漏掉了前面课程提供的重写hashCode方法教学,可是看了几次发现确实没有教学。这次的作业是让我们自己去查怎么重写hashCode方法然后再去完成作业吗

    2021-11-09 22:27:36
  • 好帮手慕小明 回复 提问者 大东2022 #2

    同学您好,

    可以在eclipse中生成hashCode方法,根据hashSet元素不重复的原理,我们可以简单的处理hashCode方法,使得hashCode返回一个固定值,虽然hashCode没有起到提高效率的作用,但是依然可以保证hashSet元素不重复。

    建议同学复习一下Set集合3-9小节中的课程

    https://class.imooc.com/lesson/2069#mid=49173

    祝同学学习愉快~

    2021-11-10 09:54:53
  • 大东2022 提问者 回复 好帮手慕小明 #3

    好的,在Eclipse中写代码,已经解决问题了,谢谢老师!

    2021-11-10 23:33:28
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师