如何使用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方法,不这样说不定哪天就会出问题。

 

问题综述完毕,当然,这个问题实质上很简单,只希望给遇到有同样疑问的朋友一点帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常用的Java List集合方法包括以下几种: 1. 将元素插入到集合的首部或尾部:可以使用LinkedList的addFirst()方法将元素插入到集合的首部,使用addLast()方法将元素插入到集合的尾部。注意,如果使用的是List接口的引用,需要进行类型转换为LinkedList才能使用LinkedList特有的方法。\[1\] 2. 通过索引访问列表元素:List接口提供了四种位置(索引)访问列表元素的方法。索引从0开始,即第一个元素的索引为0。这些方法包括get()、set()、add()和remove()。需要注意的是,具体实现类(如LinkedList)的索引值可能会有所不同,所以在不清楚具体实现的情况下,最好通过迭代列表中的元素来访问。\[2\] 3. 添加元素到ArrayList:ArrayListList接口的一个常用实现类,它采用了数组的存储方式,分配连续的内存空间。可以使用ArrayList的add()方法将元素添加到集合中。ArrayList可以添加任何类型的对象,不同类的实例对象都可以添加进去,但是添加的数据都会被转换成Object类型。\[3\] 这些是Java List集合的一些常用方法,可以根据具体的需求选择适合的方法来操作集合中的元素。 #### 引用[.reference_title] - *1* *3* [JAVA集合——(List类中常用的方法总结)](https://blog.csdn.net/gitets/article/details/109702884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java_List(集合)_常见方法操作(实例)](https://blog.csdn.net/Lee0620/article/details/120776429)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值