欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)

 更新時(shí)間:2021年09月05日 11:56:18   作者:拓跋勇  
最近看了下數(shù)組轉(zhuǎn)List的實(shí)現(xiàn)方法,總共有4種,本文就詳細(xì)的介紹一下,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

第一種方式(未必最佳):使用ArrayList.asList(strArray)

​ 使用Arrays工具類Arrays.asList(strArray)方式,轉(zhuǎn)換完成后,只能對(duì)List數(shù)組進(jìn)行查改,不能增刪,增刪就會(huì)拋出UnsupportedOperationException 異常

import java.util.Arrays;
import java.util.List; 
public static void Demo1() {
        String[] str = {"fgx", "lzy"};
        //注意這個(gè)List不是Collections包內(nèi)的List,而是util包里面的List接口
        List<String> ints = Arrays.asList(str);
    	//這里會(huì)報(bào)錯(cuò)
        ints.add("laopo");
    }

添加數(shù)據(jù)報(bào)錯(cuò):

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)

報(bào)錯(cuò)原因:Arrays.asList(str)返回值是java.util.Arrays類中一個(gè)私有靜態(tài)內(nèi)部類 java.utiil.Arrays.Arraylist,并不是我們平時(shí)用的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"};
        //注意這個(gè)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);

image-20210904210509510

使用場景:需要在將數(shù)組轉(zhuǎn)換為List后,對(duì)List進(jìn)行增刪改查操作,在List的數(shù)據(jù)量不大的情況下,可以使用。

第三種方式(通過集合工具類Collections.addAll()方法(最高效))

​ 通過Collections.addAll(arrayList, strArray)方式轉(zhuǎn)換,根據(jù)數(shù)組的長度創(chuàng)建一個(gè)長度相同的List,然后通過Collections.addAll()方法,將數(shù)組中的元素轉(zhuǎn)為二進(jìn)制,然后添加到List中,這是最高效的方法。

 public static void Demo3() {
        //注意這個(gè)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了,因?yàn)長ist中的泛型必須是引用類型。

java數(shù)組轉(zhuǎn)list誤區(qū)

一、不能把基本數(shù)據(jù)類型轉(zhuǎn)化為列表

仔細(xì)觀察可以發(fā)現(xiàn)asList接受的參數(shù)是一個(gè)泛型的變長參數(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 ]

這是因?yàn)榘裪nt類型的數(shù)組當(dāng)參數(shù)了,所以轉(zhuǎn)換后的列表就只包含一個(gè)int[]元素。

解決方案:

要想把基本數(shù)據(jù)類型的數(shù)組轉(zhuǎn)化為其包裝類型的list,可以使用guava類庫的工具方法,示例如下:

int [] intArray = { 1 ,  2 ,  3 ,  4 };
List<Integer> list = Ints.asList(intArray);

二、asList方法返回的是數(shù)組的一個(gè)視圖

視圖意味著,對(duì)這個(gè)list的操作都會(huì)反映在原數(shù)組上,而且這個(gè)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()? ,不支持這個(gè)操作??!

為什么呢?來看看Arrays.asList(T...a)方法到底做了什么吧。

嗯~~好像沒有什么呀,返回了一個(gè)ArrayLIst的實(shí)例啊。再多看點(diǎn)代碼:

這是什么鬼,原來返回的ArrayList不是java.util.ArrayList,而是Arrays中的一個(gè)內(nèi)部類實(shí)例。一下子就感到被欺騙了。

看看這個(gè)內(nèi)部類都有什么方法吧,貌似的確么有add方法呀~~

那么如果想要使用add方法應(yīng)該如何做呢?

只需要在外層再使用java.util.ArrayList包裝一層就可以了。

最后,Arrays.asList方法本身是沒有任何問題的,只是看要對(duì)轉(zhuǎn)換出來的list做什么操作,如果只是需要查詢list中的元素,那么直接使用就好;如果還需要再次添加、移除元素,那么就包裝一層java.util.ArrayList再使用吧。

到此這篇關(guān)于Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)的文章就介紹到這了,更多相關(guān)Java 數(shù)組轉(zhuǎn)List內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • @CacheEvict注解,清除緩存方式

    @CacheEvict注解,清除緩存方式

    這篇文章主要介紹了@CacheEvict注解,清除緩存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼

    SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    這篇文章主要介紹了spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • IDEA通過git回滾到某個(gè)提交節(jié)點(diǎn)或某個(gè)版本的操作方法

    IDEA通過git回滾到某個(gè)提交節(jié)點(diǎn)或某個(gè)版本的操作方法

    這篇文章主要介紹了IDEA通過git回滾到某個(gè)提交節(jié)點(diǎn)或某個(gè)版本的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring?c3p0配置的實(shí)現(xiàn)示例

    Spring?c3p0配置的實(shí)現(xiàn)示例

    在Spring框架中配置c3p0連接池可以提升數(shù)據(jù)庫操作性能,本文主要介紹了Spring?c3p0配置的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • Java 限制子類訪問的方法分析

    Java 限制子類訪問的方法分析

    這篇文章主要介紹了Java 限制子類訪問的方法,結(jié)合實(shí)例形式分析了java類的繼承與訪問相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • IDEA?設(shè)置?SpringBoot?logback?彩色日志的解決方法?附配置文件

    IDEA?設(shè)置?SpringBoot?logback?彩色日志的解決方法?附配置文件

    這篇文章主要介紹了IDEA?設(shè)置?SpringBoot?logback?彩色日志(附配置文件)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼

    Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼

    本篇文章主要介紹了Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • 解決IDEA中不能正常輸入光標(biāo)變粗的問題

    解決IDEA中不能正常輸入光標(biāo)變粗的問題

    這篇文章主要介紹了在IDEA中不能正常輸入光標(biāo)變粗的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • iOS多線程介紹

    iOS多線程介紹

    這篇文章主要介紹了iOS多線程的相關(guān)知識(shí),涉及到對(duì)進(jìn)程,線程等方面的知識(shí)講解,本文非常具有參考價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05

最新評(píng)論