添加重复数据问题

添加重复数据问题


public class ViewWord { 典型的 javaBean 

String word;

....getter and setter.....

@Override
public boolean equals(Object obj) {
   if(this==obj)
       return true;
   if(obj.getClass()==ViewWord.class){
       ViewWord viewWord=(ViewWord)obj;
       return viewWord.getWord().equals(word);
   }
   return false;
}

}


@Test
void testSet(){

   Set<ViewWord> set=new HashSet<>();
   ViewWord viewWord1=new ViewWord();
   viewWord1.setWord("a");
   ViewWord viewWord2=new ViewWord();
   viewWord2.setWord("b");
   ViewWord viewWord3=new ViewWord();
   viewWord3.setWord("b");
   System.out.println(viewWord2.equals(viewWord3));
   set.add(viewWord1);
   set.add(viewWord2);
   set.add(viewWord3);
   Iterator it=set.iterator();
   while (it.hasNext()){
       System.out.println(((ViewWord)it.next()).getWord());
   }


输出结果: 是set里面 总是有3个 ViewWord对象,,如上代码viewWord2.equals(viewWord3) 我已经比较过2和3,,明明是返回 false,证明重写的 equals方法是正确的,,但依旧能重复添加,,请问这是什么问题??  (难道Set没有自动调用equals方法吗?? 我是在spring boot框架下运行的(没有添加web框架))

正在回答

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

4回答

同学你好,这里应该选择equals() and  hashCode(),如:

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

如果使用Override Methods,就是直接使用super调用父类的方法,不推荐这种方式。

祝:学习愉快~


  • py_builder 提问者 #1
    原来还有这种操作,之前一直没看见,我都是一个一个选,谢谢提醒。
    2020-09-11 20:18:39
好帮手慕阿满 2020-09-11 14:18:44

同学你好,同学的理解是正确的。本次课程中使用的eclipse,并重写了hashCode()方法,本节课的重点不是hashCode,所以说暂且不用管hashCode方法,如:

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

使用IDEA,alt+insert快捷键自动生成hashCode()方法时,也会重写该方法,而不是直接调用父类的hashCode()方法。例如:

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

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

同学是怎样自动生成的?

祝:学习愉快~

  • 提问者 py_builder #1
    我使用IDEA的快捷键 Alt+Insert 或者 菜单code--generate, 选择 override method,, 生成的出来的 hashCode() @Override public int hashCode() { return super.hashCode(); } 这个super就是指代Object类,,使用Controll左键点进去就能看见确实就是直接调用父类Object的hashCode函数,,并没有帮我自动重写成你们发的那样
    2020-09-11 14:27:11
好帮手慕小班 2020-09-10 19:01:45

同学你好,出现重复添加,是因为同学的ViewWord类没有写hashCode方法。

hashCode()是根据对象地址生成的,每个new出来的对象的地址值是不同的,所以如果不重写hashCode方法,默认返回的是根据该对象地址生成的哈希码值,那么每个对象的hashCode()值都不一样,所以每个对象都不会相等。

所以即使当对象的属性一样时,也可以进行添加。

修改后的ViewWord如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ViewWord {
    private String word;
 
    public String getWord() {
        return word;
    }
 
    public void setWord(String word) {
        this.word = word;
    }
 
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((word == null) ? 0 : word.hashCode());
        return result;
    }
     
 
    @Override
    public boolean equals(Object obj) {
        if(this==obj)
            return true;
        if(obj.getClass()==ViewWord.class){
            ViewWord viewWord=(ViewWord)obj;
            return viewWord.getWord().equals(word);
        }
        return false;
    }      
}

如上ViewWord再来测试一下。

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

  • 提问者 py_builder #1
    因为我用的是IDEA,,我自动生成 重写hashCode方法的时候,,它是调用 super.hashCode(),,最关键的是,课程视频上说不需要管 hashCode代码,我还以为真的继承 Object类的hashCode方法就行了,,原来是已经重写了(建议加字幕说清楚,其实hashCode方法已经重写了)。。 这样的话,整个逻辑是不是这样的: HashSet调用add函数 首先, 先调用需要添加的对象的hashCode(),如果相等再调用equals(),如果再次相等则不添加此对象。
    2020-09-11 08:04:07
py_builder 提问者 2020-09-10 16:24:28

打得太快写错了,改正一下

如上代码viewWord2.equals(viewWord3) 我已经比较过2和3,,明明是返回 true,证明重写的 equals方法是正确的

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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