添加重复数据问题

添加重复数据问题


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如下:

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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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