Java Arrays.asList的三个坑

2020-04-19 16:03:11来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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

 


原文链接:https://www.cnblogs.com/Brake/p/12731888.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:非科班出身适不适合转行IT?

下一篇:Java输入语句总结