深入理解Arrays.asList()

Arrays.asList("a", "b", "c") 是 Java 中用于快速创建固定大小的列表的工具方法

1. 方法作用

  • 功能:将传入的数组或可变参数转换为一个 List 集合。

  • 示例

    List<String> list = Arrays.asList("a", "b", "c"); 
    // 等价于创建一个包含 ["a", "b", "c"] 的列表

    2. 关键特性

    (1) 固定大小(不可添加/删除元素)
    • 返回的列表是

      基于原始数组的视图,长度固定:

      list.add("d"); // ❌ 抛出 UnsupportedOperationException
      list.remove(0); // ❌ 同样抛出异常

    • 原因:底层实现是 Arrays 的内部类 ArrayList(非 java.util.ArrayList),未实现增删方法。

    (2) 可修改元素(但不可改变结构)
    • 支持通过索引修改元素值:

      list.set(0, "A"); // ✅ 允许修改:["A", "b", "c"]

    (3) 与原数组的关联
    • 列表和原数组

      共享数据(修改会互相影响):

      String[] arr = {"a", "b", "c"};
      List<String> list = Arrays.asList(arr);
      ​
      arr[0] = "X"; // 修改数组
      System.out.println(list); // 输出 [X, b, c]
      ​
      list.set(1, "Y"); // 修改列表
      System.out.println(Arrays.toString(arr)); // 输出 [X, Y, c]

底层

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

这个new调用的其实是Arrays里自定义的内部类

编译器的查找顺序

  • 首先查找 当前类(Arrays)的内部类 → 找到private static class ArrayList

  • 若未找到,才会查找 导入的包(如java.util.ArrayList

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    @java.io.Serial
    private static final long serialVersionUID = -2764017481108945198L;
    @SuppressWarnings("serial") // Conditionally serializable
    private final E[] a;
    
    // 步骤分解:
// 1. 编译器识别new ArrayList<>(a)
// 2. 在Arrays类内部找到private static ArrayList类
// 3. 调用其显式定义的构造器:
    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);//就是调用这个
    }
​
    @Override
    public int size() {
        return a.length;
    }
​
    @Override
    public Object[] toArray() {
        return Arrays.copyOf(a, a.length, Object[].class);
    }
​
    @Override
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a) {
        int size = size();
        if (a.length < size)
            return Arrays.copyOf(this.a, size,
                                 (Class<? extends T[]>) a.getClass());
        System.arraycopy(this.a, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

不可变的核心原因

  • 自定义的ArrayList继承自AbstractList未重写add/remove方法。从AbstractList继承的默认实现会抛出UnsupportedOperationException,确保了固定大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值