集合转数组,数组转集合,入坑两次,砸开揉碎总结一版
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循环逐个拷贝!
总结:无论集合转数组,还是数组转集合,数组都要求是包装类型的,否则转换会报错或不符合预期