java集合类之Arrays.asList

本文探讨了使用Java中Arrays.asList()方法创建列表时遇到UnsupportedOperationException的原因。该方法返回的列表对象不允许修改,尝试添加或删除元素会触发异常。

运行如下代码:

List<Integer> list = Arrays.asList(1,2,3);
list.add(4);

 报如下异常:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:131)
    at java.util.AbstractList.add(AbstractList.java:91)
    at com.netease.cms.logic.SitemapBase.main(SitemapBase.java:296)

 

看了一下,Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList

Arrays$ArrayList和ArrayList都是继承AbstractList, add,remove等方法在AbstractList中是默认throw UnsupportedOperationException, ArrayList override这些方法来对list进行操作,但是Arrays$ArrayList没有override这些方法,所以throw UnsupportedOperationException。

<think>我们被要求回答关于JavaArrays.asList方法的使用方法和示例。根据提供的引用,我们可以总结如下: Arrays.asList()是java.util.Arrays类的一个静态方法,用于将数组或指定的一组对象转换为一个List集合。但需要注意的是,这个List是一个固定大小的列表,由原始数组支持,因此不能进行添加或删除等改变大小的操作,否则会抛出UnsupportedOperationException异常。 ### 主要特性: 1. **固定大小**:返回的列表是基于原始数组的,因此长度固定,不能添加或删除元素。 2. **视图**:返回的列表是数组的一个视图,对列表的修改(如set方法)会反映到原数组上,反之亦然。 3. **不支持基本类型数组**:如果传入一个基本数据类型(如int[])的数组,整个数组会被视为一个元素,因为泛型T不能是基本类型。 ### 使用方法: ```java import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // 示例1:将多个元素转换为列表 List<String> list1 = Arrays.asList("A", "B", "C"); System.out.println(list1); // 输出: [A, B, C] // 示例2:将数组转换为列表 String[] array = {"Apple", "Banana", "Orange"}; List<String> list2 = Arrays.asList(array); System.out.println(list2); // 输出: [Apple, Banana, Orange] // 修改列表会反映到原数组 list2.set(0, "Cherry"); System.out.println("修改后列表: " + list2); // 修改后列表: [Cherry, Banana, Orange] System.out.println("原数组: " + Arrays.toString(array)); // 原数组: [Cherry, Banana, Orange] // 尝试添加元素(会抛出异常) try { list2.add("Grape"); // 抛出UnsupportedOperationException } catch (Exception e) { System.out.println("不支持添加操作: " + e); } } } ``` ### 注意事项: 1. **基本类型数组问题**: ```java int[] intArray = {1, 2, 3}; List<int[]> list = Arrays.asList(intArray); // 注意:这里List的元素类型是int[],而不是Integer System.out.println(list.size()); // 输出1,因为整个intArray被当作一个元素 ``` 解决方法:使用包装类型数组 ```java Integer[] integerArray = {1, 2, 3}; List<Integer> integerList = Arrays.asList(integerArray); System.out.println(integerList.size()); // 输出3 ``` 2. **固定大小**:返回的列表不支持`add()`、`remove()`、`clear()`等改变大小的操作。 3. **序列化**:如果原数组是可序列化的,那么返回的列表也是可序列化的。 ### 应用场景: - 快速创建固定大小的列表(只读或修改元素值,不改变大小) - 需要将数组作为集合来使用(如使用集合的迭代器、contains等方法) ### 总结: `Arrays.asList()`是一个方便的工具,但使用时需注意其限制。如果需要可变列表,可以这样处理: ```java List<String> newList = new ArrayList<>(Arrays.asList(array)); ``` §§相关问题§§ 1. 如何将基本类型数组(如int[])正确转换为List? 2. 为什么Arrays.asList返回的列表不支持添加和删除操作? 3. 如何创建一个可变的Arrays.asList列表? 4. Arrays.asList和Collections.singletonList有什么区别? 5.Java 8中,Arrays.asList和Stream API如何结合使用?</think>### Java `Arrays.asList()` 方法详解 `Arrays.asList()` 是 `java.util.Arrays` 类提供的静态方法,用于将数组转换为固定大小的列表。以下是其核心特性和使用方法: #### 一、基本语法 ```java public static <T> List<T> asList(T... a) ``` #### 二、核心特性 1. **固定大小列表** - 返回的列表长度固定,**不能添加或删除元素** ```java List<String> list = Arrays.asList("A", "B", "C"); list.add("D"); // 抛出 UnsupportedOperationException ``` 2. **数组视图** - 列表与原始数组共享数据 ```java String[] arr = {"Apple", "Banana"}; List<String> list = Arrays.asList(arr); list.set(0, "Orange"); // 修改列表 System.out.println(arr[0]); // 输出 "Orange"(原数组同步修改) ``` 3. **不支持基本类型** - 基本类型数组会被视为单个元素 ```java int[] nums = {1, 2, 3}; List<int[]> list = Arrays.asList(nums); System.out.println(list.size()); // 输出 1(而非3) ``` #### 三、正确使用示例 ```java // 1. 字符串数组转换 String[] fruits = {"Apple", "Banana", "Orange"}; List<String> fruitList = Arrays.asList(fruits); // 2. 直接传入元素 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 3. 修改元素(允许) fruitList.set(0, "Mango"); // 成功修改 // 4. 基本类型解决方案(Java 8+) int[] nums = {1, 2, 3}; List<Integer> numList = Arrays.stream(nums).boxed().collect(Collectors.toList()); ``` #### 四、常见问题及解决方案 | **问题场景** | **错误示例** | **解决方案** | |------------|------------|------------| | 添加/删除元素 | `list.add("X")` | 创建新列表:<br>`new ArrayList<>(Arrays.asList(...))` | | 基本类型处理 | `Arrays.asList(new int[]{1,2})` | 使用包装类:<br>`Arrays.asList(1, 2)` | | 修改列表大小 | `list.remove(0)` | 转换为可变列表:<br>`Collections.unmodifiableList()` | #### 五、典型应用场景 1. **快速初始化只读集合** ```java List<String> colors = Arrays.asList("Red", "Green", "Blue"); ``` 2. **配合集合方法使用** ```java Collections.sort(Arrays.asList(3, 1, 4, 2)); ``` 3. **批量操作元素** ```java Arrays.asList("A","B","C").replaceAll(String::toLowerCase); ``` > **重要提示**: > 返回的 `List` 是 `Arrays` 的内部类 `ArrayList`(非标准 `java.util.ArrayList`),其底层实现基于数组,因此具有固定大小特性[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值