Java Arrays.asList的三个坑

2020-04-20 00:00:00 arrays java 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作为参数

《Java Arrays.asList的三个坑》

 

 

 

上面的代码其实是等于

《Java Arrays.asList的三个坑》

 

 

 所以返回的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

《Java Arrays.asList的三个坑》

 

坑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的原因吧,因为这样会影响到原始值。

《Java Arrays.asList的三个坑》

 

    原文作者:iBrake
    原文地址: https://www.cnblogs.com/Brake/p/12731888.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章