1. 程式人生 > 其它 >集合轉陣列,陣列轉集合,入坑兩次,砸開揉碎總結一版

集合轉陣列,陣列轉集合,入坑兩次,砸開揉碎總結一版

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迴圈逐個拷貝!

總結:無論集合轉陣列,還是陣列轉集合,陣列都要求是包裝型別的,否則轉換會報錯或不符合預期