關於List和數組轉化問題

回過頭來複習Java基礎的時候,發現當初這一塊有不少細節都沒有掌握到,如今記錄下來,以更好的夯實基礎java

List轉數組

在這裏插入圖片描述

第一種方式是以無參形式直接返回一個Object[]類型的數組,不過這種方法會致使丟失類型信息,故使用較少。數組

public class Main {
    public static void main(String[] args) {
    List list=new ArrayList();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    Object[] integer=list.toArray();
    System.out.println(integer.getClass());
    for (int i=0;i<integer.length;i++){
        System.out.println(i);
    }
    }
}
複製代碼

輸出結果bash

0
1
2
3
class [Ljava.lang.Object;
複製代碼

第二種方式是給toArray(T[])傳入一個類型相同的ArrayList內部自動把元素複製到傳入的Array中:ide

public class Main {
    public static void main(String[] args) {
    List<Integer> list=new ArrayList<>();
    list.add(3);
    list.add(1);
    Integer[] idex=list.toArray(new Integer[3]);
    for (Integer i:idex){
        System.out.println(i);
    }
    }
}
複製代碼

輸出結果:工具

3
1
null
複製代碼

這種方式有兩個注意點:spa

一、傳入數組大小問題。 當傳入的數組不夠大時,List內部會建立一個恰好足夠大的數組,填充後返回,當傳入的數組比List元素還要多的時候,填充完元素,剩下的一概爲null。code

最好的方法是cdn

Integer[] idex=list.toArray(new Integer[list.size()])
複製代碼

二、傳入類型匹配問題。blog

<T> T[] toArray(T[] a);
複製代碼

toArray中的泛型通配符爲T,因此能夠傳入其餘類型的數組。以Number類型爲例:接口

public class Main {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(3);
        list.add(1);
        Number[] idex=list.toArray(new Number[3]);
        for (Number i:idex){
            System.out.println(i);
        }
    }
}
複製代碼

輸出結果

3
1
null
複製代碼

若類型不匹配,則拋出ArrayStoreException異常。

public class Main {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(3);
        list.add(1);
        Float[] idex=list.toArray(new Float[3]);
        for (Float i:idex){
            System.out.println(i);
        }
    }
}
複製代碼
Exception in thread "main" java.lang.ArrayStoreException
複製代碼

數組轉List

數組轉換爲集合使用的是數組的工具類Arrays的靜態方法asList。查看API文檔可知該方法返回由指定數組支持的固定大小的列表。

在這裏插入圖片描述

public class Main {
    public static void main(String[] args) {
        String[] name=new String[]{"Enoch","Star"};
        List<String> list=Arrays.asList(name);
        System.out.println(list);
    }
}
複製代碼

輸出結果:

[Enoch, Star]
複製代碼

須要注意的是,返回的List不必定就是ArrayList或是LinkedList,該接口返回的是一個只讀的List。

當對其調用add()、remove()會拋出UnsupportedOperationException。

由於這個新集合是由數組轉換過來的,那麼該集合就表示原來的數組,因此對集合的操做就是對數組的操做。那麼添加元素會致使原數組擴容,那麼就不能表示原來的數組了。因此不容許向該集合添加新元素了。

例:

public class Main {
    public static void main(String[] args) {
        String[] name=new String[]{"Enoch","Star"};
        List<String> list=Arrays.asList(name);
        System.out.println(list);
        list.set(0,"cool");
        System.out.println(list);
        list.add("cool");
    }
}
複製代碼

輸出結果

[Enoch, Star]
[cool, Star]
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
複製代碼

那麼如何實現添加元素這類功能?

咱們經過實驗知道數組轉化爲List是不能增刪數據的,若是須要增刪,能夠利用空集合調用addAll方法將轉化後的集合所有添加新集合就能夠進行操做了。

public class Main {
    public static void main(String[] args) {
        String[] name=new String[]{"Enoch","Star"};
        List<String> list=Arrays.asList(name);
        List<String> newList=new ArrayList<>();
        newList.addAll(list);
        System.out.println(newList);
        newList.add("cool");
        System.out.println(newList);
    }
}
複製代碼

public class Main {
    public static void main(String[] args) {
        String[] name=new String[]{"Enoch","Star"};
        List<String> list=Arrays.asList(name);
        List<String> newList=new ArrayList<>(list);
        System.out.println(newList);
        newList.add("cool");
        System.out.println(newList);
    }
}
複製代碼

輸出結果

[Enoch, Star]
[Enoch, Star, cool]
複製代碼
相關文章
相關標籤/搜索