• 理解错误的 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

  • 相关阅读:
    设计模式_2_简单工厂、工厂方法、抽象工厂比较
    SQL模拟padding函数
    MySqlHelper c#访问MySql的工具类
    常见数据库设计(1)——字典数据
    常见数据库设计(2)——历史数据问题之单记录变更
    设计模式_1_单例模式
    代码调用存储过程超时,SQL Server Management Studio里运行很快 (改进)
    转:Rowid和Rownum区别
    Oracle数据库中system和sys的区别
    转:Python之全局变量
  • 原文地址:https://www.cnblogs.com/bytecodebuffer/p/11379753.html
Copyright © 2020-2023  润新知