Java中List與數組互相轉換實例剖析。本站提示廣大學習愛好者:(Java中List與數組互相轉換實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中List與數組互相轉換實例剖析正文
本文實例剖析了Java中List與數組互相轉換的辦法。分享給年夜家供年夜家參考。詳細以下:
明天寫代碼碰到一個奇異的成績,詳細代碼不貼出了,寫一個簡化的版本。以下:
ArrayList<String> list=new ArrayList<String>(); String strings[]=(String [])list.toArray();
如許寫代碼小我認為應當沒甚麼成績,編譯也沒有成績。可是詳細運轉的時刻報異常,以下:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
然則這麼寫是沒有成績的:
ArrayList<String> list=new ArrayList<String>(); String strings[]=new String[list.size()]; for(int i=0,j=list.size();i<j;i++){ strings[i]=list.get(i); }
關於這個景象我們可以這麼說明:Java中許可向上和向下轉型,然則這個轉型能否勝利是依據Java虛擬機中這個對象的類型來完成的。Java虛擬機中保留了每一個對象的類型。而數組也是一個對象。數組的類型[Ljava.lang.Object。把[Ljava.lang.Object轉換成[Ljava.lang.String是明顯弗成能的工作,由於這裡是一個向下轉型,而虛擬機只保留了這是一個Object的數組,不克不及包管數組中的元素是String的,所以這個轉型不克不及勝利。數組外面的元素只是元素的援用,不是存儲的詳細元素,所以數組中元素的類型照樣保留在Java虛擬機中的。
依據下面的說明,我們可以把這個成績歸結到上面這個模子:
Object objs[]=new Object[10]; String strs[]=(String[])objs;
如許子和適才下面編譯毛病是一樣的。假如我們修正一下這個代碼,以下:
String strs[]=new String[10]; Object objs[]=strs;
如許子便可以編譯經由過程了。所以這個成績我們可以歸結為一個Java轉型規矩的成績。上面談一下Java數組對范型的支撐成績。
JDK5中曾經有了對范型的支撐,如許可以包管在聚集和Map中的數據類型的平安,可是,List的toArray辦法前往的居然是Object []讓人很困惑。小我感到應當可以依據范型,直接前往響應的T []。細心看了一下JDK的源碼發明List轉化為array有兩個辦法:
public Object[] toArray();
這個辦法把List中的全體元素前往一個雷同年夜小的數組,數組中的一切元素都為Object類型。
public <T> T[] toArray(T[] a);
這個辦法把List中的全體元素前往一個雷同年夜小的數組,數組中的一切元素都為T類型。
List如斯設計是由於java編譯器不許可我們new范型數組。也就是說你不克不及這麼界說一個數組:
T arr=new T[size];
然則你卻可以用T[]來表現數組,並且可以把數組強迫轉化為T[]。好比List中的public <T> T[] toArray(T[] a)是這麼完成的:
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); if (a.length > size) a[size] = null; return a; }
從下面代碼中可以看到,由於你不曉得這個數組的類型,你必需經由過程反射機制創立這個數組(a.getClass().getComponentType()辦法是獲得一個數組元素的類型)。
終究,List轉換為Array可以如許處置:
ArrayList<String> list=new ArrayList<String>(); String[] strings = new String[list.size()]; list.toArray(strings);
反過去,假如要將數組轉成List怎樣辦呢?以下:
String[] s = {"a","b","c"}; List list = java.util.Arrays.asList(s);
願望本文所述對年夜家的java法式設計有所贊助。