List利用HashSet去重不成功

由于业务需求,需要进行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去重

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章