Frage Konvertieren von Array zu Liste in Java


Wie konvertiere ich ein Array in eine Liste in Java?

Ich habe das benutzt Arrays.asList() aber das Verhalten (und die Signatur) hat sich irgendwie von Java SE geändert 1.4.2 (docs jetzt im Archiv) zu 8 und die meisten Snippets, die ich im Internet gefunden habe, verwenden das 1.4.2-Verhalten.

Beispielsweise:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • in 1.4.2 gibt eine Liste mit den Elementen 1, 2, 3 zurück
  • auf 1.5.0+ gibt eine Liste zurück, die den Array-Spam enthält

In vielen Fällen sollte es leicht zu erkennen sein, aber manchmal kann es unbemerkt verschwinden:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

752
2018-04-09 12:20


Ursprung


Antworten:


In Ihrem Beispiel liegt das daran, dass Sie keine Liste eines primitiven Typs haben können. Mit anderen Worten, List<int> Ist nicht möglich. Sie können jedoch eine haben List<Integer>.

Integer[] spam = new Integer[] { 1, 2, 3 };
Arrays.asList(spam);

Das funktioniert wie erwartet.


1100
2018-04-09 12:27



Das Problem ist, dass Varargs in Java5 eingeführt wurden und leider Arrays.asList() wurde auch mit einer Vararg-Version überlastet. Damit Arrays.asList(spam) wird vom Java5-Compiler als Vararg-Parameter von int-Arrays verstanden.

Dieses Problem wird in Effective Java 2nd Ed., Kapitel 7, Item 42 näher erläutert.


111
2018-04-09 12:26



Wenn man über den Umwandlungsweg spricht, kommt es darauf an, warum du dein brauchst List. Wenn Sie es brauchen, nur um Daten zu lesen. Ok, hier hast du es:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

Aber wenn du so etwas machst:

list.add(1);

du erhältst java.lang.UnsupportedOperationException. Für einige Fälle brauchst du das sogar:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

Der erste Ansatz konvertiert das Array nicht, sondern "repräsentiert" es wie a List. Aber Array ist unter der Haube mit all seinen Eigenschaften wie feste Anzahl von Elementen. Bitte beachten Sie, dass Sie beim Konstruieren Typ angeben müssen ArrayList.


105
2017-09-27 16:22



In Java 8 können Sie Streams verwenden:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

93
2018-05-16 23:49



Es scheint etwas spät, aber hier sind meine zwei Cent. Wir können nicht haben List<int> wie int ist ein primitiver Typ, den wir nur haben können List<Integer>.

Java 8 (int-Array)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 und darunter (Integer-Array)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // Cannot modify returned list
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

Brauchen Sie ArrayList und nicht List?

Falls wir eine spezifische Implementierung von List z.B. ArrayList dann können wir verwenden toCollection wie:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

Warum list21 Kann nicht strukturell verändert werden?

Wenn wir es benutzen Arrays.asList Die Größe der zurückgegebenen Liste ist festgelegt, da die zurückgegebene Liste nicht gültig ist java.util.ArrayList, aber eine private statische Klasse innerhalb definiert java.util.Arrays. Wenn wir also Elemente aus der zurückgegebenen Liste hinzufügen oder entfernen, a UnsupportedOperationException wird geworfen werden. Also sollten wir mitgehen list22 wenn wir die Liste ändern wollen. Wenn wir Java8 haben, können wir auch mitgehen list23.

Deutlich sein list21 kann in dem Sinne modifiziert werden, dass wir anrufen können list21.set(index,element) Diese Liste kann jedoch nicht strukturell modifiziert sein, d. h. Elemente können nicht zu der Liste hinzugefügt oder daraus entfernt werden. Sie können dies auch überprüfen Frage.

Wenn wir eine unveränderbare Liste wollen, können wir sie wie folgt umschließen:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

50
2017-12-23 05:07



Ich musste vor kurzem ein Array in eine Liste konvertieren. Später filterte das Programm die Liste, um die Daten zu entfernen. Wenn Sie die Funktion Arrays.asList (Array) verwenden, erstellen Sie eine Sammlung fester Größe: Sie können weder hinzufügen noch löschen. Dieser Beitrag erklärt das Problem besser als ich kann: Warum bekomme ich eine UnsupportedOperationException, wenn ich versuche, ein Element aus einer Liste zu entfernen?.

Am Ende musste ich eine "manuelle" Konvertierung durchführen:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

Ich könnte mit einer List.addAll (items) -Operation die Konvertierung von einem Array zu einer Liste hinzugefügt haben.


8
2017-08-31 17:26



Noch kürzer:

List<Integer> list = Arrays.asList(1, 2, 3, 4);

6
2018-03-17 09:55