`
liulanghan110
  • 浏览: 1078036 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

removeAll方法使用的问题

    博客分类:
  • JAVA
 
阅读更多

看下面的代码:

public class test {
	public static void main(String agrc[]){
		List<String> a = new ArrayList<String>();
		List<String> b = new ArrayList<String>();
		a.add("1");
		a.add("2");
		a.add("3");
		a.add("4");
		b.add("1");
		b.add("3");
		a.removeAll(b);
		System.out.println(a);
		
	}
}

 打印的结果为2,4

 

再看下面的代码:

import java.util.ArrayList;
import java.util.List;

public class test {
	public static void main(String agrc[]){	
		
		List<Student> s1 = new ArrayList<Student>();
        List<Student> s2 = new ArrayList<Student>();
        s1.add(new Student("张三"));
        s1.add(new Student("李四"));
        s1.add(new Student("王五"));
        s1.add(new Student("许六"));
        s2.add(new Student("张三"));
        s2.add(new Student("王五"));
        s1.removeAll(s2);
        System.out.println(s1.size());
	}
}


class Student{
    String name;
    
    /**
     * @param string
     */
    public Student(String name) {
        this.name = name;
    }
}

 打印结果为4,为什么removeAll失效了呢?

为什么会这样?难道removeAll方法有问题?

 

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

 

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

 

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

 

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

 

下面是重写EQUALS后的结果:

import java.util.ArrayList;
import java.util.List;

public class test {
	public static void main(String agrc[]){	
		
		List<Student> s1 = new ArrayList<Student>();
        List<Student> s2 = new ArrayList<Student>();
        s1.add(new Student("张三"));
        s1.add(new Student("李四"));
        s1.add(new Student("王五"));
        s1.add(new Student("许六"));
        s2.add(new Student("张三"));
        s2.add(new Student("王五"));
        s1.removeAll(s2);
        System.out.println(s1.size());
	}
}


class Student{
    String name;
    
    /**
     * @param string
     */
    public Student(String name) {
        this.name = name;
    }

    public boolean equals( Object obj){
        if (obj == null) return false ;
        if (this == obj) {
            return true;
        }
        if (obj instanceof Student){
            Student s = (Student) obj;
            if(this.name.equals(s.name)){
                return true;
            }
        }
        return false;
    }
    
}

 结果就为2了

 

分享到:
评论

相关推荐

    Java中ArrayList的removeAll方法详解

    但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为它可能会导致性能问题。 1. ArrayList的removeAll方法的实现机制 ArrayList的removeAll方法的实现机制是通过循环遍历ArrayList中的每个元素,然后...

    List.removeAll() 方法的性能效率

    本文将深入探讨`removeAll()`方法的性能效率,以及如何在实际应用中优化其使用。 首先,`removeAll()`方法的实现基于迭代器,这意味着它会遍历列表,每次找到匹配的元素就通过迭代器将其移除。这种方法的优点在于,...

    win10removeAll.zip

    针对这种情况,"win10removeAll.zip"文件提供了一种方法来彻底关闭Windows Defender,以解决性能问题。 首先,我们来了解一下为什么Windows Defender会占用大量的系统资源。Windows Defender在后台运行时,会进行...

    从C#中的数组中删除指定元素的几种方法,超简单

    5. **使用List类的RemoveAll方法** List类提供了RemoveAll方法,可以删除所有匹配给定条件的元素。这种方法对数组进行操作更为便捷,但请注意,它不是原地修改数组,而是返回一个新的列表。 ```csharp List&lt;int&gt;...

    VBA字典用法

    可以使用Remove方法和RemoveAll方法来删除字典对象中的关键字项目对。例如: d.Remove "a" d.RemoveAll VBA字典用法提供了一种灵活和高效的数据存储和管理方法,能够帮助开发者快速地实现复杂的数据处理任务。

    jQuery的remove()方法使用详解

    &lt;button&gt;Remove all p elements with class 'italic' $(document).ready(function(){ $("button").click(function(){ $("p").remove(".italic"); }); }); ``` 点击按钮后,所有带有"class=italic"的`&lt;p&gt;...

    EXCELVBA常见字典用法集锦及代码详解全.doc

    RemoveAll方法的使用: * RemoveAll方法用来从Dictionary对象中删除所有的关键字项目对。 * 语法:object.RemoveAll Keys方法的使用: * Keys方法用来返回Dictionary对象中的所有关键字。 * 语法:object.Keys * ...

    rust-remove_dir_all:https

    remove_dir_all 描述 可靠和快速的目录删除功能。 remove_dir_all在非Windows系统上,这是std::fs::remove_dir_all的重新导出。对于Windows,该方法可处理在快速删除目录树时发生的目录锁定。 remove_dir_contents...

    jquery使用remove()方法删除指定class子元素

    本文将详细讲解如何在jQuery中使用remove()方法来删除指定的子元素,尤其是那些具有特定class属性的元素。 ### jQuery remove()方法简介 remove()方法是jQuery中的一个重要方法,它可以从DOM中删除所有匹配的元素...

    C#遍历集合与移除元素的方法

    此外,C# 6.0引入了`RemoveAll()`方法,它可以一次性移除满足指定条件的所有元素,这样可以简化代码并提高性能: ```csharp List&lt;int&gt; numbers = new List&lt;int&gt; { 1, 2, 3, 4, 5 }; numbers.RemoveAll(n =&gt; n % 2 =...

    EXCEL VBA方法参考手册

    45. **RemoveAll方法** 46. **Show方法** 47. **Skip方法** 48. **SkipLine方法** 49. **WhatsThisMode方法** 50. **Write方法** 51. **WriteBlankLines方法** 52. **WriteLine方法** #### Add方法 **简介:** `Add...

    解决wget无法使用的方法

    ### 解决wget无法使用的方法 在Linux环境中,`wget`是一个非常重要的工具,它用于从网络上下载文件。然而,在某些情况下,用户可能会遇到`wget`无法使用的问题。本文将详细探讨这一问题,并提供一系列解决方案。 #...

    asp 动态数组 提供Add、Insert、Remove、RemoveAt、Search等方法。

    示例代码中还包含了初始化和属性获取的方法,如RemoveAll、Count、Capacity、InitialCapacity、CapacityIncrement、以及DefaultPropertyGetItem。这些方法和属性用于管理动态数组的状态和行为。例如,RemoveAll用于...

    C#操作XML时,对xmlNode增、删、改操作

    可以使用RemoveAll()或RemoveChild()方法删除XML文档中的节点,RemoveAll()方法可以删除所有子节点,而RemoveChild()方法可以删除指定的子节点。 更新节点 可以使用ReplaceChild()方法将新节点替换老节点,也可以...

    关于安装sql2005 的一些注意事项,及常见问题解决方法

    SQL Server 2005 安装注意事项和常见问题解决方法 一、卸载 SQL Server 2005 的注意事项 在卸载 SQL Server 2005 之前,需要停止所有的 SQL 服务,否则可能会出现无法卸载的问题。停止服务的步骤是:Control Panel...

    Java提取2个集合中的相同和不同元素代码示例

    总结来说,本文介绍了Java集合操作中的一种重要方法——removeAll方法,并提供了一个简单的示例代码,演示如何使用removeAll方法从两个集合中提取相同和不同元素。希望本文能够对大家有所帮助。

    c# 将左侧列表的内容添加到右侧列表

    在C#中,可以使用`Remove()`, `RemoveAt()`, `RemoveAll()`或`Clear()`等方法来删除列表中的元素。 1. `Remove(T item)`:根据指定的元素删除第一个匹配项。 2. `RemoveAt(int index)`:根据索引删除元素。 3. `...

    javascript语言参考+教程 CHM

    RemoveAll 方法; Skip 方法; SkipLine 方法; Write 方法; WriteBlankLines 方法; WriteLine 方法; 脚本运行时对象; Dictionary 对象; Drive 对象; Drives 集合; File 对象; Files 集合; ...

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

    Collection接口的主要方法包括add、addAll、remove、removeAll、retainAll等。 Iterator模式是Java集合类中的一种遍历模式,用于遍历集合的所有元素。Iterator模式可以把访问逻辑从不同的集合类中抽象出来,从而...

Global site tag (gtag.js) - Google Analytics