您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中的數組怎么轉列表”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中的數組怎么轉列表”吧!
第一種方式(未必最佳):使用ArrayList.asList(strArray)
第二種方法(支持增刪查改):
第三種方式(通過集合工具類Collections.addAll()方法(最高效))
第四種方式通過JDK8的Stream流將3總基本類型數組轉為List
java數組轉list誤區
一、不能把基本數據類型轉化為列表
二、asList方法返回的是數組的一個視圖
使用Arrays工具類Arrays.asList(strArray)方式,轉換完成后,只能對List數組進行查改,不能增刪,增刪就會拋出UnsupportedOperationException 異常
import java.util.Arrays; import java.util.List; public static void Demo1() { String[] str = {"fgx", "lzy"}; //注意這個List不是Collections包內的List,而是util包里面的List接口 List<String> ints = Arrays.asList(str); //這里會報錯 ints.add("laopo"); }
添加數據報錯:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at JAVA基礎.JDK8新特性.Java數組轉List.Demo1(Java數組轉List.java:20)
at JAVA基礎.JDK8新特性.Java數組轉List.main(Java數組轉List.java:13)
報錯原因:Arrays.asList(str)返回值是java.util.Arrays類中一個私有靜態內部類 java.utiil.Arrays.Arraylist,并不是我們平時用的java.util.ArrayList();
使用場景:Arrays.asList(strArray)
方式僅能用在將數組轉換為List后,不需要增刪其中的值,僅作為數據源讀取使用。
通過ArrayList的構造器,將Arrays.asList(strArray)的返回值由java.utilArrays.ArrayList轉為java.util.ArrayList.
關鍵代碼:ArrayList list = new ArrayList(Arrays.asList(strArray)) ;
String[] str = {"fgx", "lzy"}; //注意這個List不是Collections包內的List,而是util包里面的List接口 java.util.ArrayList<String> strings = new ArrayList<>(Arrays.asList(str)); strings.add("aop"); strings.stream().forEach(System.out::println);
使用場景:需要在將數組轉換為List后,對List進行增刪改查操作,在List的數據量不大的情況下,可以使用。
通過Collections.addAll(arrayList, strArray)
方式轉換,根據數組的長度創建一個長度相同的List,然后通過Collections.addAll()
方法,將數組中的元素轉為二進制,然后添加到List中,這是最高效的方法。
public static void Demo3() { //注意這個List不是Collections包內的List,而是util包里面的List接口 String[] str = {"fgx", "lzy"}; java.util.ArrayList<String> stringList = new ArrayList<>(str.length); Collections.addAll(stringList,str); }
如果JDK版本在1.8以上,使用流stream來將下列3種數組快速轉為List,分別是int[],long[],double[],不支持short[ ],byte[ ],char[]在JDK1.8中暫不支持.
int[] ints = {2, 34, 55, 22, 11}; long[] longs = {1, 2, 3}; double[] doubles = {1, 2, 3}; Arrays.stream(ints).boxed().collect(Collectors.toList()); Arrays.stream(longs).boxed().collect(Collectors.toList()); Arrays.stream(doubles).boxed().collect(Collectors.toList());
TIPs:為什么int[]不能直接轉為List,而Integer[]可以轉為List,而Integer[]就可以轉為List了,因為List中的泛型必須是引用類型。
仔細觀察可以發現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);
視圖意味著,對這個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再使用吧。
感謝各位的閱讀,以上就是“Java中的數組怎么轉列表”的內容了,經過本文的學習后,相信大家對Java中的數組怎么轉列表這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。