web-dev-qa-db-de.com

Array to Collection: Optimierter Code

Gibt es einen besseren Weg, dies zu erreichen?

public static List<String> toList(String[] array) {

    List<String> list = new ArrayList(array.length);

    for(int i=0; i<array.length; i++)
        list.add(array[i]);

    return list;
}

HINWEIS: Arrays.asList (a) Gibt eine Liste fester Größe zurück, die vom angegebenen Array gesichert wird. (Änderungen an der zurückgegebenen Liste "Durchschreiben" des Arrays.). Ich will dieses Verhalten nicht. Ich gehe davon aus, dass MEINE Funktion das umgeht (oder irre ich mich?)

Hier haben wir die alternative Methode:

public static List<String> toList(String[] array) {

    List<String> list = new ArrayList(array.length);

    list.addAll(Arrays.asList(array));

    return list;
}

Ich schaue es nur an, ich glaube nicht, dass es schneller ist als die erste Methode .

32
marcolopes

Was meinst du besser?

lesbarer:

List<String> list = new ArrayList<String>(Arrays.asList(array));

weniger Speicherverbrauch und möglicherweise schneller (aber definitiv nicht fadensicher):

public static List<String> toList(String[] array) {
    if (array==null) {
       return new ArrayList(0);
    } else {
       int size = array.length;
       List<String> list = new ArrayList(size);
       for(int i = 0; i < size; i++) {
          list.add(array[i]);
       }
       return list;
    }
}

Übrigens: Hier ist ein Fehler in Ihrem ersten Beispiel:

array.length löst eine Nullzeiger-Ausnahme aus, wenn das Feld null ist. Daher muss zuerst die Prüfung if (array!=null) durchgeführt werden.

35
Ralph
Arrays.asList(array);    

Beispiel: 

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

Siehe Arrays.asList class-Dokumentation.

27
Jigar Joshi
Arrays.asList(array)

Arrays verwendet new ArrayList(array). Dies ist jedoch nicht der Java.util.ArrayList. Es ist sehr ähnlich. Beachten Sie, dass dieser Konstruktor das Array als Backing-Array der Liste verwendet. So ist es O(1).

Falls Sie bereits eine Liste erstellt haben, Collections.addAll(list, array), ist dies weniger effizient.

Update: So wird Ihre Collections.addAll(list, array) eine gute Option. Ein Wrapper davon ist die Lists.newArrayList(array) der Guava. 

17
Bozho

Ein anderer Weg, es zu tun:

Collections.addAll(collectionInstance,array);
13
diegoehg

Wie wäre es mit :

List myList = new ArrayList(); 
String[] myStringArray = new String[] {"Java", "is", "Cool"}; 

Collections.addAll(myList, myStringArray); 
7
ant

Sie können verwenden:

list.addAll(Arrays.asList(array));
5
Mohamed Saligh

Sie können so etwas versuchen:

List<String> list = new ArrayList<String>(Arrays.asList(array));

public ArrayList (Sammlung c)

Erzeugt eine Liste mit dem Elemente der angegebenen Sammlung, In der Reihenfolge werden sie vom .__ zurückgegeben. Iterator der Sammlung. Die ArrayList Die Instanz hat eine Anfangskapazität von 110% der Größe des angegebenen Sammlung.

Aus hier

2
npinti

Haben Sie Arrays.asList() überprüft? siehe API

1
posdef

Ja da ist. Sie können die Arrays-Klasse aus dem Java.util. * -Paket verwenden. Dann ist es eigentlich nur eine Codezeile.

List<String> list = Arrays.asList(array);
1
MarioB.

Basierend auf der Referenz von Java.util.Collections.addAll(Collection<? super String> c, String... elements) ähnelt ihre Implementierung der ersten Methode, heißt es

Fügt der angegebenen Auflistung alle angegebenen Elemente hinzu. Hinzuzufügende Elemente können einzeln oder als Array angegeben werden. Das Verhalten dieser Convenience-Methode ist mit dem von c.addAll (Arrays.asList (elements)) identisch, aber diese Methode wird bei den meisten Implementierungen wahrscheinlich wesentlich schneller ausgeführt.

Seine Implementierung in jdk ist (jdk7)

public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    boolean result = false;
    for (T element : elements)
        result |= c.add(element);
    return result;
}

Unter den Beispielen muss der bessere Ansatz Collections.addAll(list, array); sein.

Seit Java 8 können wir Stream api verwenden, was möglicherweise bessere Ergebnisse liefert

Z.B:- 

String[] array = {"item1", "item2", "item3"};

Stream<String> stream = Stream.of(array);

//if the array is extremely large 
stream = stream.parallel();

final List<String> list = stream.collect(Collectors.toList());

Wenn das Array sehr groß ist, können Sie es als Batch-Vorgang parallel ausführen, indem Sie einen parallelen Stream (stream = stream.parallel()) verwenden, bei dem alle CPUs verwendet werden, um die Task schnell abzuschließen. Wenn die Arraylänge sehr klein ist, dauert der parallele Stream länger als der sequentielle Stream.

0
Visruth