集合转数组,数组转集合,入坑两次,砸开揉碎总结一版


https://blog.csdn.net/qq_43437465/article/details/89344983

public class Test_3_5 {

    public static void main(String[] args) {

        List ls = new ArrayList<>();
        ls.add(25);
        ls.add(69);
        ls.add(897);

        // 集合转数组,使用toArray(),注意当调用无参的这个方法的返回值是Object[]类型的,如果仅仅是输出数组中的元素,可以直接这样使用
        Object[] arr = ls.toArray();
        for (int i = 0; i < 3; i++) {
            System.out.print(arr[i] + "  ");
        }

    // 通常我们调用toArray的有参写法,如下
Listls=new ArrayList<>();
Integer[]crr=new Integer[ls.size()];
ls.toArray(crr);
        // 数组转集合,使用Arrays.asList(),但是这个方法转的集合不能进行增删操作

        int[] crr = {65, 89, 7, 4, 35, 6};
     // Listls1= Arrays.asList(crr);  // 这种写法会报错,因为crr是基本类型,
        List ls2 = Arrays.asList(crr);  // 对于基本类型,只能这种写法,但是这样就相当于把整个数组当成一个值存到集合中,不符合预期
        System.out.println(ls2.size());
Integer[] drr = {65, 89, 7, 4, 35, 6}; List ls3 = Arrays.asList(drr); //这种写法正确,也符合预期,因为drr是包装类型可以转,但是不能进行增、删操作 // ls3.add(100); // 执行增加操作会报错会报错 System.out.println(ls3.size()); // 对于上面由数组转成的集合,虽然不能进行增、删操作,但是可以执行修改操作,如下改变集合中的元素 ls3.set(2, 100); // 将ls3的下标为2的值修改成100 System.out.println(ls3.size()); System.out.println("ls3.get(2): " + ls3.get(2)); System.out.println("drr[2]: " + drr[2]); // 为了解决数组转成集合不能执行增、删操作的问题,可以通过以下两种方法解决: // 第1种,使用addAll()方法 List lsNew = new ArrayList<>(); // step1 创建一个新集合 lsNew.addAll(Arrays.asList(drr)); // step2 通过addAll方法将asList转的集合添加到新集合中,这个新集合可以正常的执行增删操作 lsNew.add(999); System.out.println(" lsNew size: " + lsNew.size()); // 第2种,创建新集合时直接将转换的集合加入 List lsNum = new ArrayList<>(Arrays.asList(drr)); lsNum.add(888); System.out.println(" lsNum size: " + lsNew.size()); } } 

总结:无论集合转数组,还是数组转集合,数组都要求是包装类型的,否则转换会报错或不符合预期

实用场景:某个函数的返回值是一个数组,但是这个数组是在执行中产生的,不清楚数组的长度,此时我们通常是创建一个结合先去保存元素,等函数执行完,再将集合转成数组返回,但是当我们返回使用toArray()时,发现会报错,原因就是toArray()的返回值是object[]

public static int[] dfg() {
        List dfg = new ArrayList<>();
        dfg.add(100);
        dfg.add(1000);
        dfg.add(10000);
//      return dfg.toArray();  //报错,因为返回值是object[]类型,不符合
    }

如果使用toArray()的有参数形式

 Listls=new ArrayList<>();
 Integer[]crr=new Integer[ls.size()];
 ls.toArray(crr);

发现返回值,还是报错,因为有参的也只能返回包装类型

为此我们可以先使用有参或者无参数的将集合转成数组tem,再使用for循环逐个拷贝!

总结:无论集合转数组,还是数组转集合,数组都要求是包装类型的,否则转换会报错或不符合预期