Java数组与List 相互转换方法详解

本文介绍了Java中数组与List之间的转换方法,包括使用Arrays.asList()和Collections.addAll()方法将数组转换为List,以及使用List的toArray()方法将List转换为数组。详细解析了不同方法的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组转List:

通过遍历赋值就不说了

1、 通过Arrays.asList()方法

public static void main(String[] args) throws Exception {

      Integer[] arr = {1, 2, 3, 4, 5};
      List<Integer> list = Arrays.asList(arr);
      System.out.println("通过Arrays.asList()方法:" + list);

      List<Integer> list2 = new ArrayList<>();
      Collections.addAll(list2,arr);
      System.out.println("通过Collections.addAll()方法:" + list2);

 }

通过Arrays.asList()方法:[1, 2, 3, 4, 5]
通过Collections.addAll()方法:[1, 2, 3, 4, 5]

Process finished with exit code 0

需要注意的是:

  1. 我们这里用的数组类型是Integer而不是int,用int直接出错,也就是说只能用基本数据类型的包装类型,才能直接转为List
    在这里插入图片描述
    这是为嘛呢?看Arrays.asList的源码,
 @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

其中<T> List<T> asList(T... a) 这是泛型的固定语法,第一个<T>是申明T为泛型,如果没有这一项,编译器无法解释后面的两个T是什么,因为Java中不存在T类型。T… a表明支持多参列表,比如

int[] arr = {1, 2, 3, 4, 5};
List<int[]> list = Arrays.asList(arr,arr);

继续上一个疑惑,原因是Arrays.asList() 需要传入的参数类型是泛型中的通配类型 ,返回值类型List也需要与之匹配,并且所有的泛型必须是引用类型。因此传入int[ ]类型的数组,由于int[ ] 整体可以看作一个引用类型,所以asList就把整个数组作为一个元素来存放到List中去,然而List中只能保存Integer类型的元素,所以报错。(这样说应该好理解一点吧,我开始还在疑惑为什么Integer[ ] 数组就可以,后来想的就是传入的是数组,要返回的List也是数组形式,二者同级,存放的都是Integer元素这样很匹配,,,而传入int[ ]时数组是一个引用类型,传入asList没问题,但是这时只能看作整体来处理了,左边Integer右边int[ ]显然不合理)

然而这样却是对的
在这里插入图片描述

  1. 另外用Arrays.asList()方法转换后的List并不是原汁原味的java.util.ArrayList类型,不能对转换后的List增删,只能查改。这是因为Arrays.asList()返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()、remove()方法会报错。
    可以通过这种方法来解决这种问题
List<Integer> list = new ArrayList<>(Arrays.asList(arr));

2、通过 Collections.addAll()方法

上边已经写了Collections.addAll()方法如何使用,并且通过这种方式转换后的List可以进行增删,由于定义的就是原汁原味的List,只是利用Collections.addAll()方法将数组中元素添加进来,跟Arrays.asList()方法一样需要保证数据类型统一。


List转数组:

1、list.toArray()方法

public static void main(String[] args) throws Exception {

      Integer[] arr = {1, 2, 3, 4, 5};
      List<Integer> list = new ArrayList<>(Arrays.asList(arr));


      Object[] b = list.toArray();
      System.out.println("通过toArray()方法将List转为Object类型数组:"+Arrays.toString(b));


      Integer[] a = (Integer[]) list.toArray(new Integer[]{});
      System.out.println("通过toArray()方法将List转为Integer类型数组:"+Arrays.toString(a));
 }

list.toArray()方法直接返回的是Object[ ]类型,如果需要前后转换类型一样,则需要通过Integer[] a = (Integer[]) list.toArray(new Integer[]{}); 有点复杂,谁让它就这样定义的呢

public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

参考

https://blog.csdn.net/x541211190/article/details/79597236?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值