怎么重写的equals没比对成绩还是重复添加了

怎么重写的equals没比对成绩还是重复添加了

正在回答

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

3回答

//我们知道,判断一个set集合中的元素是否重复,通常分为两步:第一步是调用hashCode()方法,该方法会返回一个Int型的值,如果这个返回值相等,会进行第二步判断,即为调用equals()方法;如果返回值不相等,就不用再继续调用equals()方法判断了,换而言之,系统就已经断定所加元素一定无重复,可以看到你覆写的hashCode方法

    @Ovriride
    public int hasCode(){
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + Float.floatToIntBits(score);
        result = prime * result + stuID;
        return result;
    }
    //该方法引用到了3个字段(name,score,stuID),而你所添加的元素的score值并不一样,所以
    hashCode()返回的值就不一样了,所以系统此时就已经断定了你所添加的元素一定是不重复的,
    再调用equals()方法就没意义了,这就是出现该现象的原因了。


提问者 慕无忌216588 2019-08-09 20:07:58

package arraylists;


public class Student {


//属性为:学号stuId(int),姓名name(String),成绩score(float)

private int stuID;

private String name;

private float score;

//构造方法

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

super();

this.stuID = stuID;

this.name = name;

this.score = score;

}

@Override

public String toString() {

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

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((name == null) ? 0 : name.hashCode());

result = prime * result + Float.floatToIntBits(score);

result = prime * result + stuID;

return result;

}

@Override

public boolean equals(Object obj) {

if(obj==this) {

return true;

}

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

Student student=(Student)obj;

return (student.getName().equals(name))&&(student.getStuID()==stuID);

}

return false;

}

//getter和setter方法

public int getStuID() {

return stuID;

}

public String getName() {

return name;

}

public float getScore() {

return score;

}

public void setStuID(int stuID) {

this.stuID = stuID;

}

public void setName(String name) {

this.name = name;

}

public void setScore(float score) {

this.score = score;

}

}

//测试类

package arraylists;


import java.util.HashSet;

import java.util.Iterator;



public class StudentTest {


public static void main(String[] args) {

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

HashSet<Student> set=new HashSet<Student>();

        Student one =new Student(1, "William", 65);

        Student two =new Student(2, "Tom", 87);

        Student three =new Student(3, "Lucy", 95);

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

set.add(one);

set.add(two);

set.add(three);


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

Iterator<Student> it = set.iterator();

while(it.hasNext()) {

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

}

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

//添加一个重复数据到Set中,观察输出结果

Student  four =new Student(3, "Lucy", 10);

set.add(four);

it = set.iterator();

while(it.hasNext()) {

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

}

}


}


  • 同学你好,代码完成的很好哦~ equals没有没有对比成绩还是被重复添加的原因是: Set集合在进行比较时,首先会对比它们的hashcode方法进行比较,如果他们的hashcode相同,再比较equals方法,而在这里,创建的两个对象是不同的,所以他们的hashcode值是不同的,在Java中规定,hashcode如果不相同,则它们的equals方法肯定是不相同的,所以Set集合会认为是两个不同的对象,所以会被重复添加。 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-08-09 21:52:13
好帮手慕酷酷 2019-08-09 14:29:05

同学你好,因为在equals方法中,没有比较成绩,这个return也是会返回true的,因为在比较学号和姓名是相同的,所以会重复添加,建议将equals方法的代码进行完善。

http://img1.sycdn.imooc.com//climg/5d4d127800010c3407710208.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕无忌216588 #1
    我知道这个返回true啊!但是返回true不是不添加吗
    2019-08-09 15:25:03
  • 提问者 慕无忌216588 #2
    然而我现在返回true了还是给我重复添加了重复数据
    2019-08-09 15:26:58
  • 好帮手慕酷酷 回复 提问者 慕无忌216588 #3
    同学你好,不好意思,我这这里之前看错了,建议同学将完整的代码贴出来,不要截图哦~方便老师查错。 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-08-09 15:57:37
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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