Java踩坑之List的removeAll方法


最近寫個功能,需要用到差集,然后就想到了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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM