zoukankan      html  css  js  c++  java
  • 理解错误的 Arrays.asList()

    简介

    Arrays.asList() 作用是将一个数组转换为一个List 集合。

    String[] myArray = { "Apple", "Banana", "Orange" }; 
    List<String> myList = Arrays.asList(myArray);
    //上面两个语句等价于下面一条语句
    List<String> myList = Arrays.asList("Apple","Banana", "Orange");

    JDK 对这个源码的说明

    /**
     * 返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与           
    * Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
    */ public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }

    Arrays.asList() 将数组转换为集合后,底层还是数组。

    阿里Java开发手册的描述:

     使用的数组必须是对象数组,而不是基本类型。

    int[] myArray = { 1, 2, 3 };
    List myList = Arrays.asList(myArray);
    System.out.println(myList.size());//1
    System.out.println(myList.get(0));//数组地址值
    System.out.println(myList.get(1));//报错:ArrayIndexOutOfBoundsException
    int [] array=(int[]) myList.get(0);
    System.out.println(array[0]);//1

    当传入一个原生数据类型数组时,Arrays.asList() 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组,这也就解释了上面的代码。

     我们使用包装类型数组就可以解决这个问题。

    Integer[] myArray = { 1, 2, 3 };

    使用集合的修改方法:add()remove()clear()会抛出异常。

    List myList = Arrays.asList(1, 2, 3);
    myList.add(4);//运行时报错:UnsupportedOperationException
    myList.remove(1);//运行时报错:UnsupportedOperationException
    myList.clear();//运行时报错:UnsupportedOperationException

    Arrays.asList() 方法返回的并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。

    List myList = Arrays.asList(1, 2, 3);
    System.out.println(myList.getClass());//class java.util.Arrays$ArrayList

    参考:https://mp.weixin.qq.com/s/9ld5tYerNmE0KJwPSUn2oA

  • 相关阅读:
    1202实验三 进程调度实验
    1111实验二 作业调度模拟实验
    1009实验一 认识DOS
    一起了解操作系统发展史
    0909
    进程调度模拟程序
    试验三同学评论
    实验三 进程调度模拟程序
    作业调度模拟程序
    DOS命令解释程序的编写
  • 原文地址:https://www.cnblogs.com/bytecodebuffer/p/11379753.html
Copyright © 2011-2022 走看看