程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中List與數組互相轉換實例剖析

Java中List與數組互相轉換實例剖析

編輯:關於JAVA

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved