回過頭來複習Java基礎的時候,發現當初這一塊有不少細節都沒有掌握到,如今記錄下來,以更好的夯實基礎java
第一種方式是以無參形式直接返回一個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[])
傳入一個類型相同的Array
,List
內部自動把元素複製到傳入的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
複製代碼
數組轉換爲集合使用的是數組的工具類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]
複製代碼