回過(guò)頭來(lái)復(fù)習(xí)Java基礎(chǔ)的時(shí)候匿情,發(fā)現(xiàn)當(dāng)初這一塊有很多細(xì)節(jié)都沒(méi)有掌握到宿接,現(xiàn)在記錄下來(lái)管行,以更好的夯實(shí)基礎(chǔ)
List轉(zhuǎn)數(shù)組
第一種方式是以無(wú)參形式直接返回一個(gè)Object[]類型的數(shù)組业舍,不過(guò)這種方法會(huì)導(dǎo)致丟失類型信息赎懦,故使用較少起胰。
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);
? ? }
? ? }
}
輸出結(jié)果
0
1
2
3
class [Ljava.lang.Object;
第二種方式是給toArray(T[])傳入一個(gè)類型相同的Array久又,List內(nèi)部自動(dòng)把元素復(fù)制到傳入的Array中:
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);
? ? }
? ? }
}
輸出結(jié)果:
3
1
null
這種方式有兩個(gè)注意點(diǎn):
1、傳入數(shù)組大小問(wèn)題效五。當(dāng)傳入的數(shù)組不夠大時(shí)地消,List內(nèi)部會(huì)創(chuàng)建一個(gè)剛好足夠大的數(shù)組,填充后返回畏妖,當(dāng)傳入的數(shù)組比List元素還要多的時(shí)候脉执,填充完元素,剩下的一律為null戒劫。
最好的方法是
Integer[] idex=list.toArray(newInteger[list.size()])
2半夷、傳入類型匹配問(wèn)題。
? ? <T> T[] toArray(T[] a);
toArray中的泛型通配符為T迅细,所以可以傳入其他類型的數(shù)組巫橄。以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);
? ? ? ? }
? ? }
}
輸出結(jié)果
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
數(shù)組轉(zhuǎn)List
數(shù)組轉(zhuǎn)換為集合使用的是數(shù)組的工具類Arrays的靜態(tài)方法asList嗦随。查看API文檔可知該方法返回由指定數(shù)組支持的固定大小的列表。
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);
? ? }
}
輸出結(jié)果:
[Enoch, Star]
需要注意的是,返回的List不一定就是ArrayList或是LinkedList枚尼,該接口返回的是一個(gè)只讀的List贴浙。
當(dāng)對(duì)其調(diào)用add()、remove()會(huì)拋出UnsupportedOperationException署恍。
因?yàn)檫@個(gè)新集合是由數(shù)組轉(zhuǎn)換過(guò)來(lái)的崎溃,那么該集合就表示原來(lái)的數(shù)組,所以對(duì)集合的操作就是對(duì)數(shù)組的操作盯质。那么添加元素會(huì)導(dǎo)致原數(shù)組擴(kuò)容袁串,那么就不能表示原來(lái)的數(shù)組了。所以不允許向該集合添加新元素了呼巷。
例:
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");
? ? }
}
輸出結(jié)果
[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)
那么如何實(shí)現(xiàn)添加元素這類功能?
我們通過(guò)實(shí)驗(yàn)知道數(shù)組轉(zhuǎn)化為L(zhǎng)ist是不能增刪數(shù)據(jù)的囱修,如果需要增刪,可以利用空集合調(diào)用addAll方法將轉(zhuǎn)化后的集合全部添加新集合就可以進(jìn)行操作了王悍。
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);
? ? }
}
輸出結(jié)果
[Enoch, Star]
[Enoch, Star, cool]
以上內(nèi)容都是我自己的一些感想破镰,分享出來(lái)歡迎大家指正,順便求一波關(guān)注压储,有想法的伙伴可以評(píng)論或者私信我哦~
作者:不二鑫
出處:https://juejin.im/post/5e58cf52518825490f722d2d