原文地址:http://blog.csdn.net/liuyuhua0066/article/details/6528872
看到这个标题,估计很多人会纳闷:连集合类的removeAll方法都用不好还当什么程序员。
好吧,我承认我确实没用好这个方法,鄙视我吧。O(∩_∩)O哈!
先贴问题--->
实体类(User):
- public class User {
-
- private String name;
- private int age;
-
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
-
- }
测试集合类(UserList):
- import java.util.ArrayList;
- import java.util.List;
-
- public class UserList {
-
- private List<User> subList;
- private List<User> allList;
-
- public UserList(){
- subList=new ArrayList<User>();
- allList=new ArrayList<User>();
-
- for(int i=0;i<3;i++){
- User user=new User();
- user.setAge(i);
- user.setName("lyh"+i);
- subList.add(user);
- }
-
- for(int i=0;i<10;i++){
- User user=new User();
- user.setAge(i);
- user.setName("lyh"+i);
- allList.add(user);
- }
- }
-
- public static void main(String[] args){
- UserList userList=new UserList();
- userList.allList.removeAll(userList.subList);
-
- System.out.println(userList.allList.size());
-
- }
- }
诸君认为最后的打印的结果是多少? 7 ?That's wrong !! 结果是10 。
为什么会这样哪?难道removeAll方法有问题?
这个就是最近在用到removeAll时遇到的疑问(当然,我是把实际中的问题简单的抽象出来了)。当时百思不得其解,甚至幼稚的以为是Java的BUG 。殊不知是自己脑袋BUG了 !
原因解析:
先看API
- boolean removeAll(Collection<?> c)
-
- 从列表中移除指定 collection 中包含的其所有元素(可选操作)。
没错,就是移除子集合包含的元素,那为什么不是7,而是10 。
再看API说明,移除所包含的其所有元素,注意这个字眼:包含!
因为在执行removeAll方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相等(equals),所以没有执行移除。
为什么会出现不相等的情况,实体类属性明明相同,为什么会不相等?
因为实体类没有Override hashCode和equals方法 !而在执行removeAll方法时是通过equals方法来判断集合元素是否相等的,如果没有Override equals方法,其默认的仍是比较对象,所以会出现上述问题!
归根到底,还是基础没有掌握牢固,同时也给自己提了个醒,写实体类时尽量Override hashCode和equals方法,不这样说不定哪天就会出问题。
问题综述完毕,当然,这个问题实质上很简单,只希望给遇到有同样疑问的朋友一点帮助。
分享到:
相关推荐
在这个“Java List集合的应用.rar”压缩包中,我们可以预见到一系列关于如何在实际场景中使用List集合的实例,例如学生管理系统中的注册、登录和日志管理等常见功能。 首先,让我们深入了解一下Java List集合的基础...
在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别是ArrayList,基于动态数组...
### Java集合类性能分析 #### 一、Java集合框架概览 Java集合框架是一个非常重要的概念,它提供了处理数据集合的标准方法。集合框架的核心部分主要包括集合接口、抽象类以及具体的实现类。 - **集合接口**:Java...
List接口的主要方法包括add、addAll、remove、removeAll、retainAll等。List接口的实现类有LinkedList、ArrayList、Vector和Stack等。 LinkedList类是List接口的实现类,允许null元素。LinkedList提供了额外的get、...
在Java编程语言中,`List`是集合框架的一部分,它是一个有序的集合,允许重复元素。`List`接口位于`java.util`包下,继承自`Collection`接口,并且实现了`Iterable`接口,使得我们可以使用增强型for循环来遍历列表。...
`size()`返回元素数量,`isEmpty()`检查是否为空,`contains()`检查是否包含特定元素,`iterator()`返回迭代器遍历元素,还有`containsAll()`, `addAll()`, `clear()`, `removeAll()`, `retainAll()`等用于集合的...
Java中的集合类是Java编程语言中的一个重要组成部分,主要用于存储、管理和操作对象。这些集合类位于`java.util`包中,提供了灵活且高效的方式来处理数据。集合框架的核心接口包括`Collection`、`List`、`Set`和`Map...
其中,`Collection`是最基本的接口,其他几种集合类如`Set`、`List`、`Queue`等都是它的子接口。 - **`Collection`**:表示一组对象,这些对象被称为元素。它是集合层次结构的根接口。 - **`Set`**:不允许有重复...
下面将详细介绍 Java 集合框架的实现原理和使用方法。 1.1 集合框架概述 Java 集合框架是 Java 语言中用于存储和操作数据的框架。它提供了一种统一的方式来存储和操作不同类型的数据。集合框架包括 Collection、...
- **常用方法**:Set接口通常没有索引操作,但提供add()、remove()等通用方法,以及containsAll()、equals()等比较操作。 5. **Map** - **概述**:Map接口存储键值对,键必须是唯一的,而值可以重复。HashMap、...
- `void removeAll(Collection c)`:移除集合中出现在指定集合中的所有元素。 - `void retainAll(Collection c)`:保留集合中出现在指定集合中的元素,移除其他元素。 - `Object[] toArray()`:将集合转换为数组...
Java集合框架是Java编程语言中一个非常重要的组成部分,它为开发者提供了存储和管理对象的统一方式。这个框架包括了一系列接口、抽象类以及实现...理解并熟练使用这些集合类和接口,对于编写高质量的Java代码至关重要。
此外,List接口还有subList()方法用于创建子列表,以及containsAll()、removeAll()、retainAll()等方法来处理集合间的交互。 Java集合框架还提供了一些工具类,如Collections和Arrays,它们提供了排序、复制、填充...
在IT领域,集合比较是一...通过理解并熟练运用这些方法,我们可以有效地比较和操作两个List集合,无论是查找新增、编辑还是删除的元素。在实际项目中,这种能力对于数据同步、日志分析、版本控制等多个场景都至关重要。
例如,在一个购物网站中,需要对用户的订单进行处理,可以使用 Java 集合框架的 List 集合来存储订单信息,然后使用 Stream API 的 filter 方法来过滤订单,最后使用 collect 方法将订单收集到一个新的 List 中。...
// 使用removeAll()方法删除指定一组对象 coll.removeAll(coll1); System.out.println("removeAll()方法:" + coll); // 使用clear()方法删除所有对象 coll.clear(); System.out.println("clear()方法:" + ...
1. **List集合** - **特点**:List是有序的,允许元素重复,可以通过索引访问元素。 - **子类**:ArrayList和LinkedList - **ArrayList**:基于动态数组实现,查询速度快,增删慢。适合频繁查询,不频繁增删的...
此外,`addAll`和`removeAll`等方法允许进行集合间操作。 #### 迭代器 迭代器(Iterator)是用于遍历集合的一种方式,它提供了`hasNext`、`next`等方法,可以安全地遍历集合而不担心并发修改异常。 ### List ###...
- removeAll():从当前集合中移除指定集合的元素。 - retainAll():保留当前集合中也存在于指定集合的元素,移除其他元素。 - clear():清除集合中的所有元素。 遍历集合有两种常见方式: - 使用增强的for循环...