java中的Arrays.asList()方法,得到的集合,不能进行add或remove,你知道吗?

143 阅读2分钟

在 Java 中,Arrays.asList() 方法返回的是一个 固定大小的列表(fixed-size list),这导致我们不能直接对这个列表进行 add()remove() 操作。如果你尝试调用这些方法,会抛出 UnsupportedOperationException 异常。以下是详细的原因和解释:

1. Arrays.asList() 的实现细节

Arrays.asList() 方法返回的是 java.util.Arrays 类中的一个内部类 ArrayList(注意:这与 java.util.ArrayList 是不同的类)。这个内部类实现了 List 接口,但它并不是 java.util.ArrayList,而是一个 固定大小的列表

关键点:

  • 固定大小Arrays.asList() 返回的列表是基于传入的数组创建的,列表的大小与数组的长度相同,无法动态扩展或缩小。
  • 直接引用数组Arrays.asList() 返回的列表实际上是数组的一个视图,而不是一个新的独立集合。因此,对列表的修改会直接影响到原始数组,反之亦然。

2. 为什么不能 add()remove()

由于 Arrays.asList() 返回的列表是 固定大小的,它的 add()remove() 方法被设计为抛出 UnsupportedOperationException,以防止改变列表的大小。具体来说:

  • add():尝试向列表中添加元素时,会抛出 UnsupportedOperationException,因为这会改变列表的大小,而 Arrays.asList() 返回的列表是固定大小的。
  • remove():尝试从列表中移除元素时,也会抛出 UnsupportedOperationException,因为这同样会改变列表的大小。

3. 示例代码

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String[] array = {"A", "B", "C"};
        List<String> list = Arrays.asList(array);

        // 尝试添加元素
        try {
            list.add("D");  // 抛出 UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot add elements to the list: " + e.getMessage());
        }

        // 尝试移除元素
        try {
            list.remove(0);  // 抛出 UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot remove elements from the list: " + e.getMessage());
        }

        // 修改现有元素是可以的
        list.set(0, "X");  // 这是允许的
        System.out.println(list);  // 输出: [X, B, C]
    }
}

4. 如何解决这个问题?

如果你需要一个可以动态添加和删除元素的列表,可以使用 new ArrayList<>(Arrays.asList(...)) 来创建一个新的 java.util.ArrayList,这样就可以自由地进行 add()remove() 操作。

示例代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String[] array = {"A", "B", "C"};
        List<String> fixedList = Arrays.asList(array);
        List<String> mutableList = new ArrayList<>(fixedList);

        // 现在可以添加和移除元素
        mutableList.add("D");  // 成功添加
        mutableList.remove(0); // 成功移除

        System.out.println(mutableList);  // 输出: [B, C, D]
    }
}

5. 总结

  • Arrays.asList() 返回的是一个固定大小的列表,不允许通过 add()remove() 改变其大小。
  • 如果你需要一个可以动态添加和删除元素的列表,应该使用 new ArrayList<>(Arrays.asList(...)) 来创建一个新的 ArrayList
  • Arrays.asList() 返回的列表可以直接修改现有元素(即 set() 操作是允许的),但不能改变列表的大小。

如果你有更多关于 Arrays.asList() 或其他集合类的具体问题,欢迎继续提问!