美文网首页程序员
理解5:Arrays.asList

理解5:Arrays.asList

作者: 小蜜蜂_Jade | 来源:发表于2020-06-17 11:44 被阅读0次

    一、what

    将数组或一些元素转为集合

    二、错误用法

    1. 将基本类型参数作为aslist的参数
            int[] arr = {1, 2, 3};
            List list = Arrays.asList(arr);
            System.out.println(list.size());   //1
    //原因:由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的,所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。
    
    1. 将数组作为asList参数后,修改数组或List
    String[] strings = {"你好", "世界"};
    List list = Arrays.asList(strings);
    strings[0] = "你不好";
    list.set(1, "yufchen");
    System.out.println(Arrays.toString(strings) + list.toString());
    //[你不好, yufchen][你不好, yufchen]
    //由于asList产生的集合元素是直接引用作为参数的数组,所以当外部数组或集合改变时,数组和集合会同步变化
    
    3. 数组转换为集合后,进行增删元素
    list.add("新增的话");//java.lang.UnsupportedOperationException
    //由于asList产生的集合并没有重写add,remove等方法,所以它会调用父类AbstractList的方法,而父类的方法中抛出的却是异常信息。
    

    三、真相

    List list = Arrays.asList(strings);
    ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(strings));
    
    DEBUG看类型.png
    继承区别.png
    • 长度不同 和 实现的方法不同
      Arrays.ArrayList是一个定长集合,因为它没有重写add,remove方法,所以一旦初始化元素后,集合的size就是不可变的。
    • 参数赋值方式不同
      Arrays.ArrayList将外部数组的引用直接通过 “=” 赋予内部的泛型数组,所以本质指向同一个数组。
      ArrayList是将其他集合转为数组后copy到自己内部的数组的。

    四、数组转ArrayList方式

    两种方式.png
    //既可以用于基本类型也可以返回想要的集合。
    int intArray[] = {1, 2, 3};
    List<Integer> arraylist = Arrays.stream(intArray)
            .boxed()
            .collect(Collectors.toList());
    System.out.println(arraylist);
    

    相关文章

      网友评论

        本文标题:理解5:Arrays.asList

        本文链接:https://www.haomeiwen.com/subject/ewijxktx.html