添加重复数据问题
来源:3-9 添加重复数据
py_builder
2020-09-10 16:21:47
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(),如:

如果使用Override Methods,就是直接使用super调用父类的方法,不推荐这种方式。
祝:学习愉快~
好帮手慕阿满
2020-09-11
同学你好,同学的理解是正确的。本次课程中使用的eclipse,并重写了hashCode()方法,本节课的重点不是hashCode,所以说暂且不用管hashCode方法,如:

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


同学是怎样自动生成的?
祝:学习愉快~
好帮手慕小班
2020-09-10
同学你好,出现重复添加,是因为同学的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
提问者
2020-09-10
打得太快写错了,改正一下
如上代码viewWord2.equals(viewWord3) 我已经比较过2和3,,明明是返回 true,证明重写的 equals方法是正确的