`
习惯在马桶上思考
  • 浏览: 114574 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

(转)如何使用Java List等集合类的removeAll方法

    博客分类:
  • JAVA
 
阅读更多

原文地址:http://blog.csdn.net/liuyuhua0066/article/details/6528872

 

看到这个标题,估计很多人会纳闷:连集合类的removeAll方法都用不好还当什么程序员。

 

好吧,我承认我确实没用好这个方法,鄙视我吧。O(∩_∩)O哈!

 

先贴问题--->

 

实体类(User):

 

[java] view plaincopy
  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):

 

[java] view plaincopy
  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

 

[xhtml] view plaincopy
  1. boolean removeAll(Collection<?> c)  
  2.   
  3. 从列表中移除指定 collection 中包含的其所有元素(可选操作)。   

 

没错,就是移除子集合包含的元素,那为什么不是7,而是10 。

再看API说明,移除所包含的其所有元素,注意这个字眼:包含!

 

因为在执行removeAll方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相等(equals),所以没有执行移除。

 

为什么会出现不相等的情况,实体类属性明明相同,为什么会不相等?

 

因为实体类没有Override hashCode和equals方法 !而在执行removeAll方法时是通过equals方法来判断集合元素是否相等的,如果没有Override equals方法,其默认的仍是比较对象,所以会出现上述问题!

 

归根到底,还是基础没有掌握牢固,同时也给自己提了个醒,写实体类时尽量Override hashCode和equals方法,不这样说不定哪天就会出问题。

 

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

分享到:
评论

相关推荐

    Java List集合的应用.rar

    在这个“Java List集合的应用.rar”压缩包中,我们可以预见到一系列关于如何在实际场景中使用List集合的实例,例如学生管理系统中的注册、登录和日志管理等常见功能。 首先,让我们深入了解一下Java List集合的基础...

    Java Map 集合类简介

    在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别是ArrayList,基于动态数组...

    Java集合类性能分析

    ### Java集合类性能分析 #### 一、Java集合框架概览 Java集合框架是一个非常重要的概念,它提供了处理数据集合的标准方法。集合框架的核心部分主要包括集合接口、抽象类以及具体的实现类。 - **集合接口**:Java...

    大公司最喜欢问的Java集合类面试题.docx

    List接口的主要方法包括add、addAll、remove、removeAll、retainAll等。List接口的实现类有LinkedList、ArrayList、Vector和Stack等。 LinkedList类是List接口的实现类,允许null元素。LinkedList提供了额外的get、...

    javaList的定义和方法

    在Java编程语言中,`List`是集合框架的一部分,它是一个有序的集合,允许重复元素。`List`接口位于`java.util`包下,继承自`Collection`接口,并且实现了`Iterable`接口,使得我们可以使用增强型for循环来遍历列表。...

    java 集合部分笔记

    `size()`返回元素数量,`isEmpty()`检查是否为空,`contains()`检查是否包含特定元素,`iterator()`返回迭代器遍历元素,还有`containsAll()`, `addAll()`, `clear()`, `removeAll()`, `retainAll()`等用于集合的...

    Java中的集合类.pdf

    Java中的集合类是Java编程语言中的一个重要组成部分,主要用于存储、管理和操作对象。这些集合类位于`java.util`包中,提供了灵活且高效的方式来处理数据。集合框架的核心接口包括`Collection`、`List`、`Set`和`Map...

    Java集合类总结

    其中,`Collection`是最基本的接口,其他几种集合类如`Set`、`List`、`Queue`等都是它的子接口。 - **`Collection`**:表示一组对象,这些对象被称为元素。它是集合层次结构的根接口。 - **`Set`**:不允许有重复...

    java集合详解.pdf

    下面将详细介绍 Java 集合框架的实现原理和使用方法。 1.1 集合框架概述 Java 集合框架是 Java 语言中用于存储和操作数据的框架。它提供了一种统一的方式来存储和操作不同类型的数据。集合框架包括 Collection、...

    Java集合排序及java集合类详解.pdf

    - **常用方法**:Set接口通常没有索引操作,但提供add()、remove()等通用方法,以及containsAll()、equals()等比较操作。 5. **Map** - **概述**:Map接口存储键值对,键必须是唯一的,而值可以重复。HashMap、...

    Java集合框架总结

    - `void removeAll(Collection c)`:移除集合中出现在指定集合中的所有元素。 - `void retainAll(Collection c)`:保留集合中出现在指定集合中的元素,移除其他元素。 - `Object[] toArray()`:将集合转换为数组...

    java 集合框架的原理及其使用

    Java集合框架是Java编程语言中一个非常重要的组成部分,它为开发者提供了存储和管理对象的统一方式。这个框架包括了一系列接口、抽象类以及实现...理解并熟练使用这些集合类和接口,对于编写高质量的Java代码至关重要。

    java集合框架

    此外,List接口还有subList()方法用于创建子列表,以及containsAll()、removeAll()、retainAll()等方法来处理集合间的交互。 Java集合框架还提供了一些工具类,如Collections和Arrays,它们提供了排序、复制、填充...

    两个集合比较(新增、编辑、删除)

    在IT领域,集合比较是一...通过理解并熟练运用这些方法,我们可以有效地比较和操作两个List集合,无论是查找新增、编辑还是删除的元素。在实际项目中,这种能力对于数据同步、日志分析、版本控制等多个场景都至关重要。

    Java的集合框架和StreamAPI

    例如,在一个购物网站中,需要对用户的订单进行处理,可以使用 Java 集合框架的 List 集合来存储订单信息,然后使用 Stream API 的 filter 方法来过滤订单,最后使用 collect 方法将订单收集到一个新的 List 中。...

    JAVA集合详解

    // 使用removeAll()方法删除指定一组对象 coll.removeAll(coll1); System.out.println("removeAll()方法:" + coll); // 使用clear()方法删除所有对象 coll.clear(); System.out.println("clear()方法:" + ...

    java集合.docx

    1. **List集合** - **特点**:List是有序的,允许元素重复,可以通过索引访问元素。 - **子类**:ArrayList和LinkedList - **ArrayList**:基于动态数组实现,查询速度快,增删慢。适合频繁查询,不频繁增删的...

    Java集合详解

    此外,`addAll`和`removeAll`等方法允许进行集合间操作。 #### 迭代器 迭代器(Iterator)是用于遍历集合的一种方式,它提供了`hasNext`、`next`等方法,可以安全地遍历集合而不担心并发修改异常。 ### List ###...

    java集合与泛型[参照].pdf

    - removeAll():从当前集合中移除指定集合的元素。 - retainAll():保留当前集合中也存在于指定集合的元素,移除其他元素。 - clear():清除集合中的所有元素。 遍历集合有两种常见方式: - 使用增强的for循环...

Global site tag (gtag.js) - Google Analytics