Java Arrays.asList的三個坑


坑1,用Array.asList轉換基礎類型數組

代碼

@Slf4j
public class ArrayAsListDemo {
    public static void intArrayToList() {

        int[] arr = {1, 2, 3};
        List list = Arrays.asList(arr);
        log.info("list:{} size:{} class:{}", list, list.size(), list.get(0).getClass());
    }
}

結果

list:[[I@78cb5849] size:1 class:class [I

size是1...

分析

asList一模版T作為參數

 

 

 

上面的代碼其實是等於

 

 

 所以返回的list只有一個元素,是一個int數組,有三個元素。如下。

 log.info(""+ list.get(0).length);//結果是3

結論

不能直接使用 Arrays.asList 來轉換基本類型數組

坑2,Arrays.asList 返回的 List 不支持增刪操作

代碼

    public static void putAndRemove() {
        String[] arr = {"1", "2", "3"};
        List<String> list = Arrays.asList(arr);
        try {
            list.add("4");

        } catch (UnsupportedOperationException ex) {
            log.info("add failed");
        }

        try {
            list.remove("1");

        } catch (UnsupportedOperationException ex) {
            log.info("remove failed");
        }
    }

結果

add failed
remove failed

分析

Arrays.asList返回的ArrayList是Array內部的ArrayList

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable

但是AbstractList內部的add和remove沒有實現,ArrayList,沒有重寫add和remove

 

坑3,對原始數組的修改會直接影響得到的list

代碼

    public static void modifyOriginal() {
        String[] arr = {"1", "2", "3"};
        List<String> list = Arrays.asList(arr);
        log.info("list 0 before modify: "+list.get(0));

        arr[0]="aaaaa";

        log.info("list 0 after modify: "+list.get(0));

    }

結果

list 0 before modify: 1
list 0 after modify: aaaaa

分析

asList生成的那個Array內部的ArrayList內部直接使用了原始的array導致的,這估計也是不讓生成的list add和remove的原因吧,因為這樣會影響到原始值。

 


免責聲明!

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



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