由于业务需求,需要进行List数据去重,list中存的是一个pojo,根据网上使用HashSet进行去重,发现去重失败。通过一下博文发现原因,引用一下,原文地址→Java中list去重(用set元素不重复性)
定义一个对象:
public class User{
public User(String name, int age) {
this.name = name;
this.age = age;
}
String name;
int age;
//省略getter&setter
}
测试数据:
ArrayList<User> arrayList = new ArrayList<>();
arrayList.add(new User("111",10));
arrayList.add(new User("111",10));
arrayList.add(new User("222",20));
arrayList.add(new User("111",10));
arrayList.add(new User("222",20));
arrayList.add(new User("333",30));
arrayList.add(new User("111",10));
arrayList.add(new User("111",10));
arrayList = new ArrayList<>(new HashSet<User>(arrayList));
输出结果:
arrayList [0] = 111 , 10
arrayList [1] = 111 , 10
arrayList [2] = 222 , 20
arrayList [3] = 111 , 10
arrayList [4] = 333 , 30
arrayList [5] = 111 , 10
arrayList [6] = 222 , 20
arrayList [7] = 111 , 10
去重失败。
在User类中加入
//hshset中使用equals和hascode方法进行对象比较
@Override
public boolean equals(Object o) {
if(this == o){
return true;
}
if(o == null){
return false;
}
if(getClass() != o.getClass()){
return false;
}
User user = (User) o;
if(age != user.age){
return false;
}
if(name == null){
if(user.name !=null){
return false;
}
}else{
if(!name.equals(user.name)){
return false;
}
@Override
public int hashCode() {
return 1;
}
加入重写的equals和hashConde方法,测试成功;
hashCode()方法给对象返回一个hash code值。这个方法被用于hash tables,例如HashMap等。
它的性质是:
- 在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。
- 如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果。
- 并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。
大量的实践表明,由Object类定义的hashCode()方法对于不同的对象返回不同的integer。因此在自定义对象中加入hashCode可以实现List利用HashSet去重