集合轉陣列,陣列轉集合,入坑兩次,砸開揉碎總結一版
阿新 • • 發佈:2022-03-15
https://blog.csdn.net/qq_43437465/article/details/89344983
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); // 集合轉陣列,使用toArray(),注意當呼叫無參的這個方法的返回值是Object[]型別的,如果僅僅是輸出陣列中的元素,可以直接這樣使用 Object[] arr = ls.toArray(); for (int i = 0; i < 3; i++) { System.out.print(arr[i] + " "); }
// 通常我們呼叫toArray的有參寫法,如下
List<Integer>ls=new ArrayList<>(); Integer[]crr=new Integer[ls.size()]; ls.toArray(crr);
// 陣列轉集合,使用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());
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]); // 為了解決陣列轉成集合不能執行增、刪操作的問題,可以通過以下兩種方法解決:// 第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[]
public static int[] dfg() { List<Integer> dfg = new ArrayList<>(); dfg.add(100); dfg.add(1000); dfg.add(10000); // return dfg.toArray(); //報錯,因為返回值是object[]型別,不符合 }
如果使用toArray()的有引數形式
List<Integer>ls=new ArrayList<>(); Integer[]crr=new Integer[ls.size()]; ls.toArray(crr);
發現返回值,還是報錯,因為有參的也只能返回包裝型別
為此我們可以先使用有參或者無引數的將集合轉成陣列tem,再使用for迴圈逐個拷貝!
總結:無論集合轉陣列,還是陣列轉集合,陣列都要求是包裝型別的,否則轉換會報錯或不符合預期