1. 程式人生 > >java陣列轉list誤區

java陣列轉list誤區

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 = {12345};//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 = {1234};List<Integer> list = Ints.asList(intArray);

 二、asList方法返回的是陣列的一個檢視

檢視意味著,對這個list的操作都會反映在原陣列上,而且這個list是定長的,不支援add、remove等改變長度的方法。

public class App {public static void main(String[] args) {int[] intArray = {1234};List<Integer> list = Ints.asList(intArray);list.set(0100);System.out.println(Arrays.toString(intArray));list.add(5);list.remove(0);}}

 output:

[100234]UnsupportedOperationExceptionUnsupportedOperationException

原因:

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再使用吧。