集合转数组,数组转集合,入坑两次,砸开揉碎总结一版
https://blog.csdn.net/qq_43437465/article/details/89344983
public class Test_3_5 { public static void main(String[] args) { Listls = 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}; Listls3 = 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() { Listdfg = 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循环逐个拷贝!
总结:无论集合转数组,还是数组转集合,数组都要求是包装类型的,否则转换会报错或不符合预期