java list 数组 转换

说明

平常经常会用到数组、list的相互转换,但一直没有认证研究,尤其为什么Arrays.asList返回的list不能增加、删除元素,今天彻底搞懂了。

数组转list

Arrays.asList(T… a)

数组转list,使用Arrays.asList(T… a)方法

    //数组转list
    String[] players={"kobe","t-mac","cp3"};
    //Arrays.asList返回的list是固定大小的,不能add、remove操作
    List<String> noList = Arrays.asList(players);

注意,Arrays.asLit()返回的list是固定大小的,不能执行增加、删除操作。所以通常的做法是

List<String> yesList=  new ArrayList<String>(Arrays.asList(players));
Arrays.asList返回的list为什么不能增加、删除元素?

查看源码

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

这里用到了ArrayList,不可思议了,因为Arraylist是可以增加、删除元素的呀!为什么这里却不能?继续查看源码发现这里的ArrayList原来是Arrays的内部类ArrayList,而不是java.util.ArrayList

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
            a = array;
        }
      }

Arrays$ArrayList继承自AbstractList,AbstractList的add、remove方法都抛出异常,所以不能增加、删除元素。另外,构造方法中a=array,说明,数组转换出来的list与数组,指向同一块内存。

public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
 public E remove(int index) {
        throw new UnsupportedOperationException();
    }

list转数组

list.toArray(T[] a)
        //list转数组
        List<String> list2 = new ArrayList<String>();
        list2.add("kobe");
        list2.add("t-mac");
        list2.add("cp3");
        String[] arr2 = list2.toArray(new String[list2.size()]);
<think>嗯,用户这次问的是Java数组List的方法,看来是个Java开发者遇到具体技术问题了。之前系统指令要求参考站内引用,但用户明确说了“上述引用仅供参考”,说明他需要更全面的实践方案。从引用内容看,用户应该已经看过Arrays.asList()的基础用法,但可能踩过坑才来追问。 用户引用的资料里提到四种方式,但第三篇引用关于toArray()的内容反而是List数组的,估计是用户误选了引用。需要特别注意这点,避免混淆概念。用户真正的痛点是:为什么简单的数组List会有这么多方法?哪种最安全高效? 观察到用户给出了三个引用,其中引用[1]和[2]都强调了Arrays.asList()的陷阱,特别是引用[2]还专门列出“一般方法的弊端”这个小标题。这说明用户可能已经尝试过基础方法但遇到了问题,比如尝试添加元素时抛出UnsupportedOperationException。所以深层需求其实是:如何获得一个可修改的List? 考虑到Java版本兼容性,应该分JDK8之前和之后两种情况。虽然引用[1]提到Stream流的方式,但用户资料里没有展开细节,这部分需要补充完整。另外用户是中文开发者,要特别注意ArrayList构造方法那种方式的中文术语表述——资料里写的是“new ArrayList<>(Arrays.asList())”这种泛型语法,在回答时要转换成更易懂的“用ArrayList包装”。 安全方面要强调Collections.addAll()的性能问题:虽然通用但大数据量时效率低。实际开发中最推荐的还是JDK8的Stream方案,过如果用户环境是旧项目,ArrayList包装方案最稳妥。这点要在优缺点对比表格里突出呈现。 用户没有提具体场景,但数组List通常用在:1)需要调用接收List参数的API时 2)需要利用List的批量操作时。可以在相关问题里引导用户思考应用场景,帮助他举一反三。比如为什么Android开发更常用Collections.addAll()?可能因为早期Android对Java8支持全。 最后生成的对比表格很有必要,因为用户引用的资料都是文字描述。表格要包含“是否可修改”和“内存开销”这两个关键维度——这正是Arrays.asList()方案最容易踩坑的点。 </think>以下是Java中将数组转换List的几种正确方法及注意事项,结合实践场景分析: ### 一、常用转换方法 1. **`Arrays.asList()` (基础但有限制)** ```java String[] arr = {"A", "B", "C"}; List<String> list = Arrays.asList(arr); ``` *✅ 优点*:简洁高效 *⚠️ 限制*: - 生成的List是**固定长度**(底层仍是原数组),调用 `add()`/`remove()` 会抛 `UnsupportedOperationException`[^1][^2] - 修改List元素会同步修改原数组(共享存储) 2. **`new ArrayList<>(Arrays.asList())` (推荐常规方案)** ```java List<String> list = new ArrayList<>(Arrays.asList(arr)); ``` *✅ 优点*: - 生成**完全可修改**的ArrayList(独立存储) - 兼容所有Java版本 *🔧 适用场景*:需增删元素的场景 3. **`Collections.addAll()` (灵活添加)** ```java List<String> list = new ArrayList<>(); Collections.addAll(list, arr); ``` *✅ 优点*: - 支持向**已有集合**追加数组元素 - 性能优于循环添加 *🚫 注意*:需先初始化List 4. **Java8 Stream API (现代写法)** ```java List<String> list = Arrays.stream(arr).collect(Collectors.toList()); ``` *✅ 优点*: - 链式操作可结合过滤/映射等处理 - 清晰表达数据处理流水线 *🔧 适用场景*:JDK8+项目的数据处理 ### 二、关键注意事项 1. **基本类型数组的装箱问题** ```java int[] intArr = {1,2,3}; // 错误:Arrays.asList(intArr) 会把整个数组当作单个元素 List<Integer> list = Arrays.stream(intArr).boxed().collect(Collectors.toList()); // ✅正确 ``` 2. **集合修改性对比** | 方法 | 可修改性 | 独立存储 | 原数组同步修改 | |---------------------|----------|----------|----------------| | `Arrays.asList()` | ❌可 | ❌共享 | ✅是 | | `new ArrayList<>()` | ✅可 | ✅独立 | ❌否 | ### 三、最佳实践建议 - 需增删元素 → **`new ArrayList<>(Arrays.asList(arr))`** - JDK8+数据处理 → **Stream API** - 追加到现有集合 → **`Collections.addAll()`** - 只读操作 → **`Arrays.asList()`** (确保修改) > 📌 **原理说明**:`Arrays.asList()` 返回的是 `Arrays` 内部类 `ArrayList`(非 `java.util.ArrayList`),其继承自 `AbstractList` 但未实现修改方法,导致操作受限[^2][^3]。 --- ### 相关问题 1. 为什么`Arrays.asList()`生成的List调用`add()`会抛出异常? 2. 基本类型数组(如`int[]`)转List有哪些特殊处理? 3. Java8的Stream API在集合转换中有哪些性能优势? 4. 如何将List转换数组?`toArray()`方法有哪些注意事项? 5. 在多线程环境下,数组List有哪些线程安全问题? [^1]: Java数组List的几种方式 [^2]: Arrays.asList()方法的限制与解决方案 [^3]: Java集合框架中toArray()方法的实现原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值