java陣列轉list誤區
阿新 • • 發佈:2019-01-07
ava中陣列轉list使用Arrays.asList(T... a)方法。
示例:
public class App { public static void main(String[] args) { List<String> stringA = Arrays.asList( "hello" , "world" , "A" ); String[] stringArray = { "hello" , "world" , "B" }; List<String> stringB = Arrays.asList(stringArray); System.out.println(stringA); System.out.println(stringB); } } |
執行結果:
[hello, world, A] [hello, world, B] |
這個方法使用起來非常方便,簡單易懂。但是需要注意以下兩點。
一、不能把基本資料型別轉化為列表
仔細觀察可以發現asList接受的引數是一個泛型的變長引數,而基本資料型別是無法泛型化的,如下所示:
public class App { public static void main(String[] args) { int [] intarray = { 1 , 2 , 3 , 4 , 5 }; //List<Integer> list = Arrays.asList(intarray); 編譯通不過 List< int []> list = Arrays.asList(intarray); System.out.println(list); } } output: [[I @66d3c617 ] |
這是因為把int型別的陣列當引數了,所以轉換後的列表就只包含一個int[]元素。
解決方案:
要想把基本資料型別的陣列轉化為其包裝型別的list,可以使用guava類庫的工具方法,示例如下:
int [] intArray = { 1 , 2 , 3 , 4 }; List<Integer> list = Ints.asList(intArray); |
二、asList方法返回的是陣列的一個檢視
檢視意味著,對這個list的操作都會反映在原陣列上,而且這個list是定長的,不支援add、remove等改變長度的方法。
public class App { public static void main(String[] args) { int [] intArray = { 1 , 2 , 3 , 4 }; List<Integer> list = Ints.asList(intArray); list.set( 0 , 100 ); System.out.println(Arrays.toString(intArray)); list.add( 5 ); list.remove( 0 ); } } |
output:
[ 100 , 2 , 3 , 4 ] UnsupportedOperationException UnsupportedOperationException |
原因:
get(i)? size()? 沒有問題。
add()? ,不支援這個操作!!
為什麼呢?來看看Arrays.asList(T...a)方法到底做了什麼吧。
嗯~~好像沒有什麼呀,返回了一個ArrayLIst的例項啊。再多看點程式碼:
這是什麼鬼,原來返回的ArrayList不是java.util.ArrayList,而是Arrays中的一個內部類例項。一下子就感到被欺騙了。
看看這個內部類都有什麼方法吧,貌似的確麼有add方法呀~~
那麼如果想要使用add方法應該如何做呢?
只需要在外層再使用java.util.ArrayList包裝一層就可以了。
最後,Arrays.asList方法本身是沒有任何問題的,只是看要對轉換出來的list做什麼操作,如果只是需要查詢list中的元素,那麼直接使用就好;如果還需要再次新增、移除元素,那麼就包裝一層java.util.ArrayList再使用吧。