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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class Test_3_5 {
 
    public static void main(String[] args) {
 
        List<Integer> ls = new ArrayList<>();
        ls.add(25);
        ls.add(69);
        ls.add(897);
 
        // <strong>集合转数组,</strong>使用toArray(),注意当调用无参的这个方法的返回值是Object[]类型的,如果仅仅是输出数组中的元素,可以直接这样使用
        Object[] arr = ls.toArray();
        for (int i = 0; i < 3; i++) {
            System.out.print(arr[i] + "  ");
        }<br><br>    // 通常我们调用toArray的有参写法,如下List<Integer>ls=new ArrayList<>();
Integer[]crr=new Integer[ls.size()];
ls.toArray(crr);        // <strong>数组转集合,</strong>使用Arrays.asList(),但是这个方法转的集合不能进行增删操作
 
        int[] crr = {65, 89, 7, 4, 35, 6};
     // List<Integer>ls1= Arrays.asList(crr);  // 这种写法会报错,因为crr是基本类型,
        List<int[]> ls2 = Arrays.asList(crr);  // 对于基本类型,只能这种写法,但是这样就相当于把整个数组当成一个值存到集合中,不符合预期
        System.out.println(ls2.size());<br>
        Integer[] drr = {65, 89, 7, 4, 35, 6};
        List<Integer> 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]);
 
     // <strong>为了解决数组转成集合不能执行增、删操作的问题,可以通过以下两种方法解决:</strong>
    // 第1种,使用addAll()方法
        List<Integer> lsNew = new ArrayList<>(); // step1 创建一个新集合
        lsNew.addAll(Arrays.asList(drr));  // step2 通过addAll方法将asList转的集合添加到新集合中,这个新集合可以正常的执行增删操作
        lsNew.add(999);
        System.out.println(" lsNew size: " + lsNew.size());
 
     // 第2种,创建新集合时直接将转换的集合加入
        List<Integer> lsNum = new ArrayList<>(Arrays.asList(drr));
        lsNum.add(888);
        System.out.println(" lsNum size: " + lsNew.size());
    }
} 

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

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

 

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

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

1
2
3
List<Integer>ls=new ArrayList<>();
Integer[]crr=new Integer[ls.size()];
ls.toArray(crr);

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

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

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

posted @   Justin_Hu  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示