原文連接:https://javadevnotes.com/java...java
譯文:數組
有時候咱們須要將數組類型轉換成爲集合類型,由於後者是一個更爲強大的數據結構,java.util.List 有許多普通數組不支持的功能。好比:咱們能夠經過List的內置方法輕易地檢測list是否包含某一個特定的值。下面是一些怎麼將數組轉換爲list的例子。數據結構
Arrays 類有一個方便的方法asList,能夠幫助轉換任務,下面是語法:
public static <T> List<T> asList(T... a)code
注意:參數不必定必須是數組,可變參數也能夠。它能夠建立一個list
public class Test { public static void main(String[] args) { List<String> myList = Arrays.asList("Apple"); } }
以上代碼將穿件一個包含一個元素"Apple"的集合。咱們也能夠這樣作:對象
public class Test { public static void main(String[] args) { List<String> myList = Arrays.asList("Apple", "Orange"); } }
這將生成一個包含兩個元素"Apple","Orange"的集合get
由於這是一個可變參數。咱們能夠傳遞一個數組,數組元素被認定爲參數,例子:io
public class Test { public static void main(String[] args) { String[] myArray = { "Apple", "Banana", "Orange" }; List<String> myList = Arrays.asList(myArray); for (String str : myList) { System.out.println(str); } } }
這樣,一個String集合被建立出來了。數組myArray被添加進去了。myList 集合有三個元素,一下是輸出:class
Apple
Banana
Orangethread
這個方法有一些問題,傳遞進去的數組必須是一個對象數組,而不能是一個基本類型數組。好比:stream
public class Test { public static void main(String[] args) { int[] myArray = { 1, 2, 3 }; List myList = Arrays.asList(myArray); System.out.println(myList.size()); } }
代碼輸出是1。爲何呢?由於asList方法指望一個對象的可變參數,可是傳遞進去的參數是一個基本類型數組,它建立了一個數組集合。因此該集合的爲惟一元素是myArray。所以 myList.get(0)
將返回與myArray一樣的對象。
asList()方法返回的list對象是固定大小的,不能容納更多的元素,好比:
public class Test { public static void main(String[] args) { String[] myArray = { "Apple", "Banana", "Orange" }; List<String> myList = Arrays.asList(myArray); myList.add("Guava"); } }
輸出以下:
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at Test.main(Test.java:8)
由於myList是固定長度的,不能添加更多元素。
由於該方法返回的List對象不是java.util包下面的ArrayList,而是Arrays內部的ArrayList類型。改類沒有實現add,revmove,clear方法,因此任何對改集合結構修改的調用都將失敗。
正如上面提到的。傳遞一個基本類型數組到asList方法不生效,一個不引入第三方庫的解決辦法是經過Java8 的流,例子以下:
public class Test { public static void main(String[] args) { int[] intArray = { 5, 10, 21 }; List myList = Arrays.stream(intArray).boxed() .collect(Collectors.toList()); } }
數組的每個元素都被從int轉換成了Integer類型(裝箱),數組就被轉成了List類型。
正如上面陷阱部分提到的,Arrays.asList()方法不支持添加或者移除元素。若是你不想這樣,下面是可選方案:
public class Test { public static void main(String[] args) { String[] myArray = { "Apple", "Banana", "Orange" }; List<String> myList = new ArrayList<String>(Arrays.asList(myArray)); myList.add("Guava"); } }
這段代碼顯式地建立了一個新的ArrayList對象,而後將Arrays.asList的結果添加進去了。由於咱們建立了一個ArrayList。因此沒有添加移除限制,上面的代碼執行結束前有四個元素。不要期望代碼執行時拋出異常。
有時候解決問題,使用咱們本身的實現方案是更好的。下面是一個將java數組轉換成List的簡單例子:
public class Test { public static void main(String[] args) { String[] myArray = { "Apple", "Banana", "Orange" }; List<String> myList = new ArrayList<String>(); for (String str : myArray) { myList.add(str); } System.out.println(myList.size()); } }
代碼的預期輸出是3.由於邏輯執行完集合了有3個元素。
咱們代碼的負面是代碼更長了,並且咱們在重複造輪子。好處就是當咱們的需求改變時,咱們能夠順應自定義。好比:下面的代碼,每個元素都被添加到list中兩次
public class Test { public static void main(String[] args) { String[] myArray = { "Apple", "Banana", "Orange" }; List<String> myList = new ArrayList<String>(); for (String str : myArray) { myList.add(str); myList.add(str); } System.out.println(myList.size()); } }
輸出是6,由於數組中的元素都被添加兩次。下面是另一個將String數組轉換成List<Integer> 的例子: