如何使用Java List等集合類的removeAll方法

看到這個標題,估計很多人會納悶:連集合類的removeAll方法都用不好還當什麼程序員。

 

好吧,我承認我確實沒用好這個方法,鄙視我吧。O(∩_∩)O哈!

 

先貼問題--->

 

實體類(User):

  1. public class User {  
  2.       
  3.     private String name;  
  4.     private int age;  
  5.       
  6.     //setter and getter   
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public int getAge() {  
  14.         return age;  
  15.     }  
  16.     public void setAge(int age) {  
  17.         this.age = age;  
  18.     }  
  19.       
  20. }  

 

測試集合類(UserList):

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. public class UserList {  
  5.       
  6.     private List<User> subList;  
  7.     private List<User> allList;  
  8.       
  9.     public UserList(){  
  10.         subList=new ArrayList<User>();  
  11.         allList=new ArrayList<User>();  
  12.           
  13.         for(int i=0;i<3;i++){  
  14.             User user=new User();  
  15.             user.setAge(i);  
  16.             user.setName("lyh"+i);  
  17.             subList.add(user);  
  18.         }  
  19.           
  20.         for(int i=0;i<10;i++){  
  21.             User user=new User();  
  22.             user.setAge(i);  
  23.             user.setName("lyh"+i);  
  24.             allList.add(user);  
  25.         }  
  26.     }  
  27.       
  28.     public static void main(String[] args){  
  29.         UserList userList=new UserList();  
  30.         userList.allList.removeAll(userList.subList);//調用removeAll方法   
  31.           
  32.         System.out.println(userList.allList.size());  
  33.           
  34.     }  
  35. }  

 

諸君認爲最後的打印的結果是多少? 7 ?That's wrong !! 結果是10

 

爲什麼會這樣哪?難道removeAll方法有問題?

 

這個就是最近在用到removeAll時遇到的疑問(當然,我是把實際中的問題簡單的抽象出來了)。當時百思不得其解,甚至幼稚的以爲是Java的BUG 。殊不知是自己腦袋BUG了 !

 

 

原因解析:

 

先看API

  1. boolean removeAll(Collection<?> c)  
  2.   
  3. 從列表中移除指定 collection 中包含的其所有元素(可選操作)。   

沒錯,就是移除子集合包含的元素,那爲什麼不是7,而是10 。

再看API說明,移除所包含的其所有元素,注意這個字眼:包含!

 

因爲在執行removeAll方法時,會先對集合元素進行比較,如果元素相等才執行移除操作,說到這,相信很多人都已經明白是怎麼回事了,因爲不相等(equals),所以沒有執行移除。

 

爲什麼會出現不相等的情況,實體類屬性明明相同,爲什麼會不相等?

 

因爲實體類沒有Override hashCode和equals方法 !而在執行removeAll方法時是通過equals方法來判斷集合元素是否相等的,如果沒有Override equals方法,其默認的仍是比較對象,所以會出現上述問題!

 

歸根到底,還是基礎沒有掌握牢固,同時也給自己提了個醒,寫實體類時儘量Override hashCode和equals方法,不這樣說不定哪天就會出問題。

 

問題綜述完畢,當然,這個問題實質上很簡單,只希望給遇到有同樣疑問的朋友一點幫助。

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