Java 數組轉List的四種方式小結

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

​ 使用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);

image-20210904210509510

使用場景:需要在將數組轉換為List後,對List進行增刪改查操作,在List的數據量不大的情況下,可以使用。

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

​ 通過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);
    }

第四種方式通過JDK8的Stream流將3總基本類型數組轉為List

​ 如果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中的泛型必須是引用類型。

java數組轉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);

二、asList方法返回的是數組的一個視圖

視圖意味著,對這個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 數組轉List的四種方式小結的文章就介紹到這瞭,更多相關Java 數組轉List內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: