集合转数组,数组转集合,入坑两次,砸开揉碎总结一版
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循环逐个拷贝!
总结:无论集合转数组,还是数组转集合,数组都要求是包装类型的,否则转换会报错或不符合预期
本文来自博客园,作者:{Justin_Hu},转载请注明原文链接:{https://www.cnblogs.com/gchenghu/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)