2017年6月16日 星期五

Arrays.asList 使用某些方法時拋出 UnsupportedOperationException

※更方便的判斷

int i = 1;
if (i == 1 || i == 3 || i == 4 || i == 6) {
    // ...
}
    
// 使用 Arrays.asList
List<?> list = Arrays.asList(1, 3, 4, 6);
int i = 1;
if (list.contains(i)) {
    // ...
}

※使用 Arrays.asList 可以很輕鬆的判斷



※使用某些方法會有例外

List<Integer> list = Arrays.asList(1,2,3);
list.add(4);

※執行時拋出了「java.lang.UnsupportedOperationException」

※這是因為 return 是回傳 java.util.Arrays 的私有類別 ArrayList,裡面並沒有add方法,所以會到他的父類別 AbstractList 裡去找,會先找到一個參數的 add,然後繼續呼叫兩個參數的 add,然後直接 new UnsupportedOperationException(),可以看到 remove 、set 方法也是一樣

※所以只要私有類別 ArrayList 沒有實作,且父類也都沒實作,也就是只有部分實作,如果使用到沒實作的方法,就會報例外

※AbstractList 有實作 List,所以可以用 List 接值

※如果一定要使用 add 等方法,只好另外宣告了,如下:
List<Integer> list = Arrays.asList(1, 3, 4, 6);
    
List<Integer> list2 = new ArrayList<>();
list2.addAll(list);
list2.add(7);
System.out.println(list2);

※此時泛型不能用 「?」


List 有一個 subList 方法,產生新的 List 後,對新舊增刪改都會影響到兩個 List,所以也是建議用讀的方式就好,甚至新集合的 size 大於舊集合也是執行期報錯

沒有留言:

張貼留言