`
liulanghan110
  • 浏览: 1065447 次
  • 性别: 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了

 

分享到:
评论

相关推荐

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

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

    Java中ArrayList的removeAll方法详解

    主要给大家介绍了关于Java中ArrayList的removeAll方法的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。

    rust-remove_dir_all:https

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

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

    代码如下:Class Vector Private vector_datas() Private initial_capacity ‘初始化容量 Private ...RemoveAll End Sub Public Function RemoveAll() element_count = 0 initial_capacity = 10 capacity_increment = 10

    javascript语言参考+教程 CHM

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

    node.js中的events.emitter.removeAllListeners方法使用说明

    主要介绍了node.js中的events.emitter.removeAllListeners方法使用说明,本文介绍了events.emitter.removeAllListeners 的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下

    java集合-EnumSet的使用

    EnumSet 是 Java 中用于存储枚举类型元素的集合类。它是 AbstractSet 的子类,并专门为枚举类型设计,提供了高效的实现。...你可以使用 addAll()、retainAll() 和 removeAll() 方法来执行这些操作。

    QAC工具介绍和使用说明(供一种可量化措施的代码度量值属性:33基于功能 32基于文件和4个项目级别)

    选择Remove all path reduction from the project and associated personalities项若要撤消所有的相对路径和环境变量从相关个性设置项目恢复到完全在所有情况下限定的路径 例如,一个被重建的“Diff”项目如下所示与...

    ActiveReports.NET_0623中文版

    /&gt;put into appsettingRun licensepro.exe to remove all limitations, regsiter it with anyname/company and serial: DD-APN-10-C001733将&lt;appSettings&gt;&lt;add key=&quot;DataDynamicsARLic&quot; value=&quot;,,,&...

    jquery插件冲突(jquery.noconflict)解决方法分享

    许多的 JS 框架类库都选择使用$符号作为函数或变量名,jQuery是其中最为典型的一个。在 jQuery 中,$ 符号只是 window.jQuery 对象的一个引用,因此即使 $ 被删除,window.... 代码如下:jQuery.noConflict([removeAll

    一个数组,可以发出元素的消息并根据它的变化进行差异 -Swift-Ruby-下载

    (更多详情、使用方法,请下载后细读README.md文件) "ObservableArray-RxSwift ObservableArray是一个数组,它可以...array.removeAll() 这将打印: [\\foo\\, \\bar\\, \\buzz\\] [\\foo\\, \\bar\\, \\buzz\\, \\coffe

    jQuery实现给页面换肤的方法

    本文实例讲述了jQuery给页面换肤的方法。分享给大家供大家参考。具体分析如下: 给页面换肤的效果有不少同学做过,今天在逛... //remove all the other classes $('#styleSwitch .button').removeClass('selected');

    java实现的链表

    数据结构中基于java实现的链表,注释清楚。可以提供插入,删除,更新,访问的功能,包含add, insertAt, remove, removeAt, removeAll,clear, setAt, getAt, indexOf, size, isEmpty 方法。

    实验6报告.doc

    Router#erase startup-config Erasing the nvram filesystem will remove all files! Continue? [confirm] [OK] Erase of nvram: complete Router# 步骤 4:重新加载配置。 当返回提示符状态时,使用 reload 命令。...

    C#全能速查宝典

    2.2.22 SelectAll方法——选定所有文本 176 2.2.23 Selected属性——是否选定 176 2.2.24 SelectedCells属性——用户选定的单元格集合 177 2.2.25 SelectedColumns属性——用户选定的列集合 178 2.2.26 SelectedRows...

    jsCore:复杂的 JavaScript polyfill 和方法集

    方法.all() 方法.unique() 方法.refine() 方法.shuffle() 方法.range() 方法.remove() 命名空间.css 方法.prefix() 方法.get() 方法.set() 方法.getTransitionTime() 带前缀的属性名称 命名空间.dom 方

    Python3 菜鸟查询手册

    09.11 列表方法 List remove()方法.png 09.12 列表方法 List reverse()方法.png 09.13 列表方法 List sort()方法.png 09.14 列表方法 List clear()方法.png 09.15 列表方法 List copy()方法.png 10 元组.png ...

    oscache-2.4.1-full.rar

    、OSCache是什么? OSCache标记库由OpenSymphony设计,它是... } } &lt;br/&gt; public void removeAllNews() { // TODO 自动生成方法存根 newsCache.removeAll(); } &lt;br/&gt;} &lt;br/&gt;

    matlab导入excel代码-wi18-matlab-workshop:Matlab2018冬季研讨会

    数学课程最有可能希望您构建函数并在命令窗口中运行它们,以便逐步学习方法。 一些有用的命令窗口工具是: clear %used to remove all varaibles in your workspace clc %used to remove all previous outputs in ...

    Windows 脚本技术参考手册

    LogEvent 方法 MapNetworkDrive 方法 Popup 方法 Quit 方法 Read 方法 ReadAll 方法 ReadLine 方法 RegDelete 方法 RegRead 方法 RegWrite 方法 Remove 方法 ...

Global site tag (gtag.js) - Google Analytics