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去重

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