Konvertieren von 'ArrayList <String> in' String [] 'in Java


1023

Wie kann ich ein ArrayList<String>Objekt String[]in Java in ein Array konvertieren ?


2
Habe diese Antwort mit einem aktualisierten Ansatz mit JDK-11 gemacht , der eine neue, ebenso leistungsfähige API mit toArray(T[])ähnlicher Syntax wie einführt Stream.toArray.
Naman

Antworten:


1790
List<String> list = ..;
String[] array = list.toArray(new String[0]);

Zum Beispiel:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);

Die toArray()Methode ohne Übergabe eines Arguments wird zurückgegeben Object[]. Sie müssen also ein Array als Argument übergeben, das mit den Daten aus der Liste gefüllt und zurückgegeben wird. Sie können auch ein leeres Array übergeben, aber Sie können auch ein Array mit der gewünschten Größe übergeben.

Wichtiges Update : Ursprünglich wurde der oben genannte Code verwendet new String[list.size()]. Dieser Blogpost zeigt jedoch, dass die Verwendung aufgrund von JVM-Optimierungen new String[0]jetzt besser ist.


16
Macht die Größe des Arguments einen Unterschied?
Thorbjørn Ravn Andersen

37
es spart eine weitere Array-Instanziierung
Bozho

59
Es stellt sich heraus, dass das Bereitstellen eines Arrays mit der Länge Null, selbst das Erstellen und Wegwerfen, im Durchschnitt schneller ist als das Zuweisen eines Arrays mit der richtigen Größe. Für Benchmarks und Erklärungen siehe hier: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks

2
(Sorry. Rhetorische Frage. Die Antwort ist natürlich, weil Java keine echten Generika macht; es fälscht sie meistens nur durch das
Wirken

3
@lyuboslavkanev Das Problem ist, dass der generische Typ in Java nicht ausreicht, um tatsächlich Objekte basierend auf diesem Typ zu erstellen. nicht einmal ein Array (was lächerlich ist, weil das für jeden Typ funktionieren sollte ). Soweit ich sehen kann, ist damit nur Casting möglich. Um überhaupt Objekte des Typs zu erstellen, benötigen Sie das eigentliche ClassObjekt, das sich möglicherweise nicht vollständig vom generischen Typ ableiten lässt. Der Grund dafür ist, wie gesagt, dass die gesamte Konstruktion gefälscht ist; Es wird alles nur intern als Objekt gespeichert.
Nyerguds

170

Eine Alternative in Java 8:

String[] strings = list.stream().toArray(String[]::new);

Java 11+:

String[] strings = list.toArray(String[]::new);

25
Oder irgendwelche Vorteile?
James Watkins

1
Ich würde diese Syntax bevorzugen, aber IntelliJ zeigt damit einen Compilerfehler an und beschwert sich "T [] ist keine funktionale Schnittstelle".
Glen Mazza

3
@GlenMazza können Sie nur toArrayfür ein StreamObjekt verwenden. Dieser Kompilierungsfehler kann auftreten, wenn Sie den Stream mit a reduzieren Collectorsund dann versuchen, ihn anzuwenden toArray.
Udara Bentota

39

Sie können die toArray()Methode verwenden für List:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);

Oder Sie können die Elemente manuell zu einem Array hinzufügen:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}

Hoffe das hilft!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

Mit copyOf kann ArrayList auch für Arrays ausgeführt werden.


4
Schlagen Sie camelcase vor, also "objectList = ..." und "stringArray". Es ist auch Arrays.copyOf ... Hauptstadt O.
Jason Weden

1
list.toArray () verwendet intern Arrays.copyOf ()
David

25

Ausgehend von Java-11 kann alternativ die API verwendet werden Collection.toArray(IntFunction<T[]> generator), um Folgendes zu erreichen:

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray

10

In Java 8:

String[] strings = list.parallelStream().toArray(String[]::new);

12
Dies ist wirklich schon in dieser Antwort enthalten . Fügen Sie es möglicherweise als Bearbeitung zu dieser Antwort hinzu, anstatt als völlig neue.
Fluss

11
Warum parallelStream()statt einfach stream()?
Yoory N.

7

In Java 8 kann dies mit erfolgen

String[] arrayFromList = fromlist.stream().toArray(String[]::new);

6

Generics Lösung verdeckte jede List<Type>an String []:

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}

Hinweis Sie müssen override toString()Methode.

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
Dies funktioniert, ist aber nicht sehr effizient und dupliziert die Funktionalität in der akzeptierten Antwort mit zusätzlichem Code.
Alan Delimon

5

Falls eine zusätzliche Manipulation der Daten gewünscht wird, für die der Benutzer eine Funktion wünscht, ist dieser Ansatz nicht perfekt (da die Klasse des Elements als zweiter Parameter übergeben werden muss), sondern funktioniert:

import java.util.ArrayList; import java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}

5

Wenn Ihre Anwendung bereits Apache Commons lib verwendet, können Sie die akzeptierte Antwort leicht ändern, um nicht jedes Mal ein neues leeres Array zu erstellen:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);

Es gibt einige weitere vorab zugewiesene leere Arrays verschiedener Typen in ArrayUtils.

Wir können JVM auch dazu bringen, ein leeres Array für uns zu erstellen:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());

Aber auf diese Weise gibt es wirklich keinen Vorteil, nur Geschmackssache, IMO.


5

Sie können verwenden Iterator<String>, um die Elemente von ArrayList<String>:

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}

Jetzt können Sie Elemente aus String[]jeder Schleife abrufen .


Ich habe herabgestimmt, weil: 1. keine Generika verwendet werden, die Sie dazu zwingen, 2. zu verwenden, .toString()wo keine explizite Besetzung erforderlich wäre, 3. Sie nicht einmal inkrementieren iund 4. das whilebesser dran wäre, durch a ersetzt zu werden for. Vorgeschlagener Code:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Olivier Grégoire

Okay, ich habe es jetzt verstanden. Vielen Dank.
Vatsal Chavda

Im Idealfall sollten Sie Ihren Code so bearbeiten, dass er diese Kommentare enthält (das heißt, wenn Sie der Meinung sind, dass sie für Ihre Antwort gut sind!). Ich werde nicht in Betracht ziehen, meine Downvote zu entfernen, solange der Code unverändert bleibt.
Olivier Grégoire

Ich bin neu hier, also weiß ich noch nicht, wie die Dinge hier funktionieren. Aber schätzen Sie Ihre Hilfe Kumpel.
Vatsal Chavda

Das ist viel besser! Ich habe nur ein bisschen bearbeitet, aber Sie haben gerade erfahren, wie es funktioniert: Antwort geben, verbessern, Lorbeeren holen;)
Olivier Grégoire


4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

Per Kommentar habe ich einen Absatz hinzugefügt, um zu erklären, wie die Konvertierung funktioniert. Zunächst wird List in einen String-Stream konvertiert. Anschließend wird Stream.toArray verwendet, um die Elemente im Stream in ein Array zu konvertieren. In der letzten obigen Anweisung ist "size -> new String [size]" eine IntFunction-Funktion, die ein String-Array mit der Größe des String-Streams zuweist. Die Aussage ist identisch mit

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
Welchen Wert bringt diese Antwort? Es scheint nur andere Antworten zu wiederholen, ohne zu erklären, warum es die Frage beantwortet.
Richard

2

Mit dieser Methode können Sie List in String Array konvertieren:

 Object[] stringlist=list.toArray();

Das vollständige Beispiel:

ArrayList<String> list=new ArrayList<>();
    list.add("Abc");
    list.add("xyz");

    Object[] stringlist=list.toArray();

    for(int i = 0; i < stringlist.length ; i++)
    {
          Log.wtf("list data:",(String)stringlist[i]);
    }

1
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
    String[] delivery = new String[deliveryServices.size()];
    for (int i = 0; i < deliveryServices.size(); i++) {
        delivery[i] = deliveryServices.get(i).getName();
    }
    return delivery;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.