首页 > 编程语言 >Java踩坑之List的removeAll方法

Java踩坑之List的removeAll方法

时间:2023-11-02 12:34:26浏览次数:36  
标签:Java ArrayList List removeAll add static new

最近写个功能,需要用到差集,然后就想到了java List 中有一个removeAll方法,正好可以实现差集功能,可以直接调用。

我们知道,apache 的common-collections 包下面得CollectionUtils.subtract()方法也可以对List作差集,为了比较两种方式差集的结果, 见Java 中 CollectionUtils.subtract() 和 List.removeAll() 方法求差集的区别 ,随手写了个测试方法,代码如下:

代码:

复制代码
 1 public class TestArray {
 2 
 3     private void test1() {
 4         List<Integer> a = Arrays.asList(1, 1, 2, 2, 3, 3, 4);
 5         List<Integer> b = Arrays.asList(1, 2, 3);
 6 
 7         a.removeAll(b);
 8         System.out.println(a);
 9     }
10     
11     public static void main(String[] args) {
12         new TestArray().test1();
13     }
14 }
复制代码

编译运行,结果如下:

 

 

给我整蒙了,然后,我写了另外一段代码,如下

复制代码
 1 public class TestArray {
 2 
 3     private void test2() {
 4         List<Integer> c = new ArrayList<>();
 5         c.add(1);
 6         c.add(1);
 7         c.add(2);
 8         c.add(2);
 9         c.add(3);
10         c.add(3);
11         c.add(4);
12 
13         List<Integer> d = new ArrayList<>();
14         d.add(1);
15         d.add(2);
16         d.add(3);
17 
18         c.removeAll(d);
19         System.out.println(c);
20 
21     }
22 
23     public static void main(String[] args) {
24         new TestArray().test2();
25     }
26 }
复制代码

莫名其妙的是,这次我又把结果输出来了:

>>>

[4]

 

我比较了一下两段代码,发现问题出在List的创建方法上。

点击跟踪代码,可以发现,对于Arrays.asList(),返回的List是自己内部实现的ArrayList 而不是util下的ArrayList对象,它是一个不可变对象,因此调用removeAll等方法回出错

复制代码
 1     public static <T> List<T> asList(T... a) {
 2         return new ArrayList<>(a);
 3     }
 4 
 5     /**
 6      * @serial include
 7      */
 8     private static class ArrayList<E> extends AbstractList<E>
 9         implements RandomAccess, java.io.Serializable
10     {
11         private static final long serialVersionUID = -2764017481108945198L;
12         private final E[] a;
13 
14         ArrayList(E[] array) {
15             a = Objects.requireNonNull(array);
16         }
17       ......
18     }
复制代码

 转自:Java踩坑之List的removeAll方法 - r1-12king - 博客园 (cnblogs.com)

标签:Java,ArrayList,List,removeAll,add,static,new
From: https://www.cnblogs.com/h2285409/p/17805126.html

相关文章

  • javamail发送附件DataSource使用文件流解决方案
    问题:在使用james邮件服务器发送邮件时,附件是存储在华为云服务器上的,只能通过ApacheHttpClient去下载,存储在FTP上的文件同样会碰到这个问题。API上邮件添加附件的方法:/*************1.本地文件*************///将本地文件作为附件DataSourcedataSource=newFileDataSourc......
  • JavaScript中大于Math.pow(2, 53)的数,如何进行进制转换?精度问题,超过18位的数字如何进
    console.log('JavaScript中大于Math.pow(2,53)的数,如何进行进制转换?')//示例console.group('示例')console.log('使用bignumber.js库完美解决。[https://github.com/MikeMcl/bignumber.js/]')console.log('示例:18446744071545290752转为二进制')console.log......
  • Ajax + java Servlet 制作Web进度条
     运行效果图  index2.jsp <%@pagelanguage="java"pageEncoding="UTF-8"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><scripttype="text/javascript"langua......
  • JavaScript操作checkbox的方式
    JavaScript操作checkbox的方式和操作radio的方式相似,都是利用元素项的checked属性来完成。先获取checkbox元素集合,遍历集合,对集合中的每一项做操作。 <body> <p> <labelfor="hobby">Hobby: <inputtype="checkbox"name="hobby"value="reading"/>rea......
  • JavaScript 保存文件
       <scriptsrc="http://cdn.jsdelivr.net/g/filesaver.js"></script><script>functionSaveAsFile(t,f,m){try{varb=newBlob([t],{type:m});saveAs(b,f);}catch(......
  • java字符串多行写法
    有一个很长的字符串,想分成多行书写,主要为了美观。 VB代码中可以将一个很长的字符串分成多行书写,例如:Stringstr="adfasdfasdfas\asdfasdfasdfasdf\asdfasdf" Java没有相似的处理方式。 变通处理方式:Strings="Itwasthebestoftimes,it......
  • JAVA语言基础
    Java是一种高级编程语言,最初由SunMicrosystems(后被Oracle收购)于1995年发布。它被广泛用于开发各种类型的应用程序,从桌面应用程序到移动应用程序和大型企业级应用程序。以下是Java语言的一些基础知识:1.跨平台性:Java以"WriteOnce,RunAnywhere"(一次编写,到处运行)为特点。这是因为......
  • javap - 查阅 Java 字节码
    javap命令可以用来查阅字节码文件,可以将指定的字节码文件反编译,反解析出当前类对应基本信息、常量池(Constantpool)、字段区域、方法区(Code[JVM指令集])、异常表(Exceptiontable)、本地变量表(LocalVariableTable)、行数表(LineNumberTable)和字节码操作数栈的映射表(StackMapTable)等信息......
  • java的一些基础知识
    Java标识符:Java标识符是用来标识Java中的变量、方法、类等名称的。Java标识符的命名规则如下:1.标识符只能由数字、字母、下划线和美元符号组成。2.第一个字符必须是字母、下划线或美元符号。3.标识符的长度没有限制。4.标识符是区分大小写的。Java运算符:Java运算符是用来......
  • java语言基础
    1.标识符在Java中,标识符是用于命名变量、方法、类和其他各种元素的名称。标识符的命名规则包括:可以包含字母、数字、下划线和美元符号。必须以字母、下划线或美元符号开头。大小写敏感。不能使用Java的保留字(例如:public、class、static等)作为标识符。2.运算符Java提供了丰富的......