Java中如何將?int[]?數(shù)組轉(zhuǎn)換為?ArrayList(list)
Java中數(shù)組轉(zhuǎn)List的四種方式
第一種方式(未必最佳):使用ArrayList.asList(strArray)
使用Arrays工具類Arrays.asList(strArray)方式,轉(zhuǎn)換完成后,只能對List數(shù)組進行查改,不能增刪,增刪就會拋出UnsupportedOperationException 異常
import java.util.Arrays; import java.util.List; public static void Demo1() { String[] str = {"fgx", "lzy"}; //注意這個List不是Collections包內(nèi)的List,而是util包里面的List接口 List<String> ints = Arrays.asList(str); //這里會報錯 ints.add("laopo"); }
添加數(shù)據(jù)報錯:
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基礎(chǔ).JDK8新特性.Java數(shù)組轉(zhuǎn)List.Demo1(Java數(shù)組轉(zhuǎn)List.java:20)
at JAVA基礎(chǔ).JDK8新特性.Java數(shù)組轉(zhuǎn)List.main(Java數(shù)組轉(zhuǎn)List.java:13)報錯原因:Arrays.asList(str)返回值是java.util.Arrays類中一個私有靜態(tài)內(nèi)部類
java.utiil.Arrays.Arraylist,并不是我們平時用的java.util.ArrayList();使用場景:Arrays.asList(strArray)方式僅能用在將數(shù)組轉(zhuǎn)換為List后,不需要增刪其中的值,僅作為數(shù)據(jù)源讀取使用。
第二種方法(支持增刪查改):
通過ArrayList的構(gòu)造器,將Arrays.asList(strArray)的返回值由java.utilArrays.ArrayList轉(zhuǎn)為java.util.ArrayList.
關(guān)鍵代碼:ArrayList list = new ArrayList(Arrays.asList(strArray)) ;
String[] str = {"fgx", "lzy"}; //注意這個List不是Collections包內(nèi)的List,而是util包里面的List接口 java.util.ArrayList<String> strings = new ArrayList<>(Arrays.asList(str)); strings.add("aop"); strings.stream().forEach(System.out::println);
使用場景:需要在將數(shù)組轉(zhuǎn)換為List后,對List進行增刪改查操作,在List的數(shù)據(jù)量不大的情況下,可以使用。
第三種方式(通過集合工具類Collections.addAll()方法(最高效))
通過Collections.addAll(arrayList, strArray)方式轉(zhuǎn)換,根據(jù)數(shù)組的長度創(chuàng)建一個長度相同的List,然后通過Collections.addAll()方法,將數(shù)組中的元素轉(zhuǎn)為二進制,然后添加到List中,這是最高效的方法。
public static void Demo3() { //注意這個List不是Collections包內(nèi)的List,而是util包里面的List接口 String[] str = {"fgx", "lzy"}; java.util.ArrayList<String> stringList = new ArrayList<>(str.length); Collections.addAll(stringList,str); }
第四種方式通過JDK8的Stream流將3總基本類型數(shù)組轉(zhuǎn)為List
如果JDK版本在1.8以上,使用流stream來將下列3種數(shù)組快速轉(zhuǎn)為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[]不能直接轉(zhuǎn)為List,而Integer[]可以轉(zhuǎn)為List,而Integer[]就可以轉(zhuǎn)為List了,因為List中的泛型必須是引用類型。
java數(shù)組轉(zhuǎn)list誤區(qū)
一、不能把基本數(shù)據(jù)類型轉(zhuǎn)化為列表
仔細觀察可以發(fā)現(xiàn)asList接受的參數(shù)是一個泛型的變長參數(shù),而基本數(shù)據(jù)類型是無法泛型化的,如下所示:
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類型的數(shù)組當(dāng)參數(shù)了,所以轉(zhuǎn)換后的列表就只包含一個int[]元素。
解決方案:
要想把基本數(shù)據(jù)類型的數(shù)組轉(zhuǎn)化為其包裝類型的list,可以使用guava類庫的工具方法,示例如下:
int [] intArray = { 1 , 2 , 3 , 4 }; List<Integer> list = Ints.asList(intArray);
二、asList方法返回的是數(shù)組的一個視圖
視圖意味著,對這個list的操作都會反映在原數(shù)組上,而且這個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
下面介紹下Java中如何將 int[] 數(shù)組轉(zhuǎn)換為 List(ArrayList)
前言
說起數(shù)組轉(zhuǎn)換成 ArrayList,很多同學(xué)第一反應(yīng)就是遍歷數(shù)組,將元素逐個添加到 ArrayList 中,但是這個看著就lower,一般不會這么答。
所以馬上就會想到Arrays工具類的 asList 方法,如果你這么答,那么恭喜你,答錯入坑。
為什么不能用 Arrays 的 asList 方法將 int[] 裝換成 ArrayList
如果此處數(shù)組 int[] 換作是 Integer[] 或者任何一個引用類型元素的數(shù)組都正確,Arrays 的 asList 方法只能轉(zhuǎn)換引用類型元素的數(shù)組。
asList 方法的源碼就是這么定義的:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
注意:Arrays.asList(T... a)返回的List中元素是不可變的。
從源碼可以看出Arrays.asList(T... a)返回的是一個ArrayList,但是這個ArrayList是Arrays的內(nèi)部類,不是我們集合框架下的那個ArrayList。
使用stream進行轉(zhuǎn)換(jdk8 推薦)
jdk版本低于1.8不可以使用。
數(shù)組通過 Arrays 工具類的 stream() 方法進行流化,獲取 Stream 對象。boxed()方法是用來裝箱的。
int[] arys = {1,2,3}; List<Integer> list = Arrays.stream(arys).boxed().collect(Collectors.toList());
要轉(zhuǎn)化為ArrayList還需要進行一次強制類型轉(zhuǎn)化
遍歷數(shù)組,逐個加入元素到List中
可以使用for、增強for循環(huán)、迭代器。
使用for循環(huán)遍歷數(shù)組,性能稍微好那么一丟丟。增強for的本質(zhì)就是迭代器,寫法更加簡潔。
這里代碼就做展示了。
到此這篇關(guān)于Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List(ArrayList)的文章就介紹到這了,更多相關(guān)Java 數(shù)組轉(zhuǎn)換為 List內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用nexus3.X上傳本地jar包并且通過pom讀取的解決方案(全網(wǎng)最新)
這篇文章主要介紹了使用nexus3.X上傳本地jar包并且通過pom讀取的解決方案(全網(wǎng)最新),本文內(nèi)容有點長,結(jié)合圖文實例給大家講解的非常詳細,需要的朋友可以參考下2023-11-11深入解析Spring Cloud內(nèi)置的Zuul過濾器
這篇文章主要給大家深入的介紹了Spring Cloud內(nèi)置的Zuul過濾器的相關(guān)資料,文中給大家介紹的很詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-02-02Spring?Security中使用authorizeRequests遇到的問題小結(jié)
Spring?是非常流行和成功的?Java?應(yīng)用開發(fā)框架,Spring?Security?正是?Spring?家族中的成員,這篇文章主要介紹了Spring?Security中使用authorizeRequests遇到的問題,需要的朋友可以參考下2023-02-02利用Java+Selenium+OpenCV模擬實現(xiàn)網(wǎng)頁滑動驗證
目前很多網(wǎng)頁都有滑動驗證,目的就是防止不良爬蟲扒他們網(wǎng)站的數(shù)據(jù)。本文將介紹通過Java Selenium OpenCV解決網(wǎng)頁滑塊驗證,需要的可以參考一下2022-01-01Java 基礎(chǔ)全面講解StringBuffer類的使用
當(dāng)對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象2022-01-01SpringMVC配置多個properties文件之通配符解析
這篇文章主要介紹了SpringMVC配置多個properties文件之通配符解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09淺談spring中的default-lazy-init參數(shù)和lazy-init
下面小編就為大家?guī)硪黄獪\談spring中的default-lazy-init參數(shù)和lazy-init。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Java內(nèi)存泄漏問題處理方法經(jīng)驗總結(jié)
今天小編就為大家分享一篇關(guān)于Java內(nèi)存泄漏問題處理方法經(jīng)驗總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01