添加重复数据问题
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框架))
正在回答
同学你好,这里应该选择equals() and hashCode(),如:
如果使用Override Methods,就是直接使用super调用父类的方法,不推荐这种方式。
祝:学习愉快~
同学你好,出现重复添加,是因为同学的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再来测试一下。
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
打得太快写错了,改正一下
如上代码viewWord2.equals(viewWord3) 我已经比较过2和3,,明明是返回 true,证明重写的 equals方法是正确的
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星