retainAll是一個常用的Java集合操作方法,用來取兩個集合的交集。比較常見的使用場景是在兩個List中,找出在其中一個List中同時也存在於另一個List中的元素。
一、retainAll基本用法
List<String> list1 = new ArrayList<>(Arrays.asList("a", "b", "c", "d")); List<String> list2 = new ArrayList<>(Arrays.asList("b", "d", "e", "f")); list1.retainAll(list2); System.out.println(list1); //輸出:[b, d]
在上面的示例中,我們創建了兩個List,分別包含了一些字元串。我們調用了list1的retainAll方法,這個方法會保留list1中同時也存在於list2中的元素,也就是”b”和”d”,其他元素都被刪除了。
二、retainAll效率問題
在實際開發中,我們一般會在較大的集合中使用retainAll方法。那麼,retainAll的效率問題就需要引起我們的注意。
retainAll方法的本質就是使用循環遍歷去一個一個判斷元素是否在另一個集合中出現,因此,retainAll的效率取決於集合的大小。
下面我們通過一個比較來看一下retainAll方法的效率:
List<String> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { list1.add(String.valueOf(i)); if (i % 100 == 0) { list2.add(String.valueOf(i)); } } long start = System.currentTimeMillis(); list1.retainAll(list2); long end = System.currentTimeMillis(); System.out.println("retainAll time: " + (end - start) + "ms");
在上面的示例中,我們創建了一個大小為10000000的List,其中每100個元素我們取一個並放到list2中,再執行retainAll方法。我們可以看到,執行完retainAll方法後輸出的時間是:
retainAll time: 144ms
這個時間可能並不是特別長,但是如果我們要在生產環境中處理更大的集合,retainAll的效率問題就有可能成為瓶頸了。
三、retainAll過程中的異常情況
在使用retainAll方法的時候,我們也需要注意一些異常情況。下面我們列舉一下可能會發生的情況:
1. retainAll(null)
如果我們調用retainAll方法的參數為null,就會拋出NullPointerException異常:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c")); list.retainAll(null); //拋出NullPointerException異常
2. retainAll與底層集合類型不一致
如果我們使用retainAll方法的集合類型與底層集合類型不一致,就會拋出ClassCastException異常:
List<String> list1 = new ArrayList<>(Arrays.asList("a", "b", "c")); Set<String> set = new HashSet<>(Arrays.asList("b", "c")); list1.retainAll(set); //拋出ClassCastException異常
在上面的示例中,我們創建了一個List和一個Set,然後將Set傳遞給List的retainAll方法,這時就會拋出ClassCastException異常,因為底層集合類型不一致。
3. retainAll與不可修改的集合
如果我們使用retainAll方法的集合是一個不可修改的集合,就會拋出UnsupportedOperationException異常:
List<String> list1 = new ArrayList<>(Arrays.asList("a", "b", "c")); List<String> list2 = Arrays.asList("b", "c"); list2.retainAll(list1); //拋出UnsupportedOperationException異常
在上面的示例中,我們將一個可修改的List和一個不可修改的List傳遞給retainAll方法進行操作,這時就會拋出UnsupportedOperationException異常。
四、參考資料
1. Java文檔:https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#retainAll-java.util.Collection-
2. Java線上編程:https://www.javacreed.com/when-to-use-retail-all-with-sample-implementation/
原創文章,作者:ZXCAJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/372741.html