一帘瞭、array 轉(zhuǎn) list
1??直接使用Arrays的asList方法
String[] str = new String[]{"a", "b", "c"};
List<String> list = Arrays.asList(str);
2??for循環(huán)方式
String[] str = new String[]{"a", "b", "c"};
List<String> list = new ArrayList<>();
for (int i = 0; i < str.length; i++) {
list.add(str[i]);
}
二淑掌、array 與 Set 的互轉(zhuǎn)
三、list 轉(zhuǎn) array
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
String str[] = (String[]) list.toArray();
System.out.println(str);
}
編譯雖通過(guò)蝶念,但運(yùn)行時(shí)報(bào)Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object;
抛腕。正確的寫法如下:
String str[] = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
str[i] = list.get(i);
}
解釋:Java中允許向上和向下轉(zhuǎn)型,但是這個(gè)轉(zhuǎn)型是否成功是根據(jù)Java虛擬機(jī)(JVM)中這個(gè)對(duì)象的類型來(lái)實(shí)現(xiàn)的媒殉。JVM中保存了每個(gè)對(duì)象的類型担敌,而數(shù)組也是一個(gè)對(duì)象,數(shù)組的類型是[Ljava.lang.Object
适袜。把[Ljava.lang.Object
轉(zhuǎn)換成[Ljava.lang.String
顯然是不可能的事情柄错,因?yàn)檫@里是一個(gè)向下轉(zhuǎn)型,而虛擬機(jī)只保存了這是一個(gè)Object的數(shù)組,不能保證數(shù)組中的元素是String的售貌,所以這個(gè)轉(zhuǎn)型不能成功给猾。數(shù)組里面的元素只是元素的引用,不是存儲(chǔ)的具體元素颂跨,所以數(shù)組中元素的類型還是保存在Java虛擬機(jī)中的敢伸。
四、解決
由三恒削,可以把這個(gè)問(wèn)題歸納到下面這個(gè)模型:
Object objs[]=new Object[10];
String strs[]=(String[])objs;
這樣子和剛才上面運(yùn)行錯(cuò)誤是一樣的池颈。如果修改代碼如下:
String strs[]=new String[10];
Object objs[]=strs;
這樣子就可以了。所以這個(gè)問(wèn)題可以歸結(jié)為 Java 轉(zhuǎn)型規(guī)則的問(wèn)題钓丰。JDK5 中躯砰,Java 數(shù)組開(kāi)始支持范型,這樣可以保證在集合和 Map 中的數(shù)據(jù)類型的安全携丁∽列可是,List 的 toArray() 返回的竟然是 Object [] 讓人很迷惑梦鉴。開(kāi)發(fā)者可以根據(jù)范型李茫,直接返回相應(yīng)的 T[]。查看 JDK 源碼肥橙,發(fā)現(xiàn) List 轉(zhuǎn)化為 array 有兩個(gè)方法:
1??public Object[] toArray();
該方法把 List 中的全部元素返回一個(gè)相同大小的數(shù)組魄宏,數(shù)組中的所有元素都為 Object 類型。
2??public T[] toArray(T[] a);
該方法把 List 中的全部元素返回一個(gè)相同大小的數(shù)組存筏,數(shù)組中的所有元素都為 T 類型宠互。
List 如此設(shè)計(jì)是因?yàn)?Java 編譯器不允許 new 范型數(shù)組。也就是說(shuō)不能這么定義一個(gè)數(shù)組:T arr=new T[size];
椭坚。但是卻可以用 T[] 來(lái)表示數(shù)組名秀,而且可以把數(shù)組強(qiáng)制轉(zhuǎn)化為 T[]。比如 List 中的public T[] toArray(T[] a)
是這么實(shí)現(xiàn)的:
public <T> T[] toArray(T[] a) {
if (a.length < size){
a=(T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
System.arraycopy(elementData, 0, a, 0, size);
}else if (a.length > size){
a[size] = null;
}
return a;
}
由上藕溅,因?yàn)椴恢肋@個(gè)數(shù)組的類型,必須通過(guò)反射機(jī)制創(chuàng)建這個(gè)數(shù)組(a.getClass().getComponentType()
是取得一個(gè)數(shù)組元素的類型)继榆。最終巾表,List 轉(zhuǎn)換為 Array 可以這樣處理:
ArrayList<String> list=new ArrayList<String>();
String[] str= new String[list.size()];
list.toArray(str);
反過(guò)來(lái),如將數(shù)組轉(zhuǎn)換為 List 如下:
String[] str = {"a","b","c"};
List list = java.util.Arrays.asList(str);