程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java數組轉換為List的實踐

Java數組轉換為List的實踐

編輯:JAVA綜合教程

Java數組轉換為List的實踐


不曾想到,“Java數組轉換為List”竟然有這麼多的學問,震撼之余夾帶些許不堪。關於“Java數組轉換為List”其實是非常基礎的知識,況且有很多人在博客中均有所討論,難免讓我覺得寫這樣的討論文章顯得多少沒有必要!轉念想到“不積硅步,無以成千裡”,於是強迫自己再次對該問題做一些深層次的實踐。

一、Create ArrayList from array

Create ArrayList from array在stackoverflow上引發的討論之熱烈程度多少讓我感到吃驚:

new ArrayList(Arrays.asList(array)) List list = Arrays.asList(array); Use Guava ——Lists.newArrayList(aStringArray); Collections.addAll(arraylist, array); for(Element e : array) —— list.add(e);

從裡面可以提取出以上五種的方案,關於Guava的,由於我對此不甚了解,所以暫時放過,那麼剩余四種情況,我們就詳細來做實踐。

①、new ArrayList(Arrays.asList(array))

其實我覺得第一種方案,挺簡潔好使的。

String[] array1 = { new String("1"), new String("2"), new String("3") };

arrayList = new ArrayList(Arrays.asList(array1));

for (String s : arrayList) {
    System.out.print(s + "、");
}

try {
    arrayList.add("111");

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

try {
    array[1] = "qw";

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

System.out.println();
System.out.println("----------new ArrayList(Arrays.asList(array1))---------------");

輸出內容如下:

1、2、3、1、2、3、111、1、2、3、111、
———-new ArrayList(Arrays.asList(array1))—————

但是,看完stackoverflow上的討論,覺得這種方案確實有最大的弊端!

you may create and fill two lists !

好吧,這個過程會產生兩個list,真讓人操碎了心啊!不過請注意,該種方法與第二種方法之間多了一個“new ArrayList”,那麼為什麼要再new一次呢?請看第二種方法的介紹!

②、List list = Arrays.asList(array)

從java的API中我們可以看出

asList
public static List asList(T… a)返回一個受指定數組支持的固定大小的列表。(對返回列表的更改會“直接寫”到數組。)此方法同 Collection.toArray() 一起,充當了基於數組的 API 與基於 collection 的 API 之間的橋梁。返回的列表是可序列化的,並且實現了 RandomAccess。
此方法還提供了一個創建固定長度的列表的便捷方法,該列表被初始化為包含多個元素:

 List stooges = Arrays.asList("Larry", "Moe", "Curly");

參數:
a - 支持列表的數組。
返回:
指定數組的列表視圖。

此方法會有兩個弊端:

list長度固定,也就是說無法進行add元素。 對返回列表的更改會“直接寫”到數組。

我們接著看例子:

String[] array = { new String("1"), new String("2"), new String("3") };

List arrayList = Arrays.asList(array);

for (String s : arrayList) {
    System.out.print(s + "、");
}

try {
    arrayList.add("111");

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

try {
    arrayList.set(1, "qw");

    for (String s : array) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

System.out.println();
System.out.println("----------Arrays.asList---------------");

輸出結果如下:

1、2、3、java.lang.UnsupportedOperationException1、qw、3、
———-Arrays.asList—————

從結果中可以證明:

This will work fine. But some caveats:

The list returned from asList has fixed size. So, if you want to be able to add or remove elements from the returned list in your code, you’ll need to wrap it in a new ArrayList. Otherwise you’ll get an UnsupportedOperationException. The list returned from asList() is backed by the original array. If you modify the original array, the list will be modified as well. This may be surprising.

所以該種“數組轉換為List”的做法局限很多,限制了轉換後List的使用!

那麼再回到第一種方法“new ArrayList(Arrays.asList(array))”上,使用new ArrayList顯然規避了以上兩種限制,但同時創建了兩個list,所以以上兩種方法雖然在代碼量上足夠簡潔,但弊端同樣很多,也就是說這兩種方法多少有點“後遺症”。

④、Collections.addAll(arraylist, array);

跳過Guava,我們來看“Collections.addAll(arraylist, array)”。

String[] array2 = { new String("1"), new String("2"), new String("3") };

arrayList = new ArrayList();
Collections.addAll(arrayList, array2);

for (String s : arrayList) {
    System.out.print(s + "、");
}

try {
    arrayList.add("111");

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

try {
    array[1] = "qw";

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

System.out.println();
System.out.println("-------------Collections.addAll(arrayList, array2)------------");

對於第四種方法,我覺得還不錯,代碼也足夠的簡潔,且沒有多余的“後遺症”,所以推薦這種做法!

另外,通過api可以看到如下解釋:

public static boolean addAll(Collection< ? super T> c,T… elements)

將所有指定元素添加到指定 collection 中。可以分別指定要添加的元素,或者將它們指定為一個數組。此便捷方法的行為與 c.addAll(Arrays.asList(elements)) 的行為是相同的,但在大多數實現下,此方法運行起來可能要快得多。

在分別指定元素時,此方法提供了將少數元素添加到現有 collection 中的一個便捷方式:
Collections.addAll(flavors, “Peaches ‘n Plutonium”, “Rocky Racoon”);

該方式對應還有另外一種寫法

String[] array3 = { new String("1"), new String("2"), new String("3") };

ArrayList arrayList3 = new ArrayList();
arrayList3.addAll(Arrays.asList(array3));

這種寫法就不如Collections.addAll!

⑤、for(Element e : array) —— list.add(e);

其實,很多時候我們忽略了最原始的寫法,也就是所謂的

arrayList3 = new ArrayList();
for (String s : array3) {
    arrayList3.add(s);
}

這種寫法在我看來,也足夠的簡潔,同樣沒有後遺症,並且運行速度,我想,肯定不慢!


總結完上述“Java數組轉換為List”方法後,真心感覺原來基礎知識也這麼有深度,趕緊學起來吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved