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

1023

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

Alex
quelle
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.

Bozho
quelle
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);
Vitalii Fedorenko
quelle
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!

Codecubed
quelle
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.

Rajesh Vemula
quelle
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
Naman
quelle
10

In Java 8:

String[] strings = list.parallelStream().toArray(String[]::new);
Mike Shauneu
quelle
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);
KayV
quelle
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);
Khaled Lela
quelle
5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}
HZhang
quelle
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()));
  }
}
Roberto Attias
quelle
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.

Yoory N.
quelle
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 .

Vatsal Chavda
quelle
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
5

In Java 11 können wir die Collection.toArray(generator)Methode verwenden. Der folgende Code erstellt ein neues Array von Zeichenfolgen:

List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)

von java.base's java.util.Collection.toArray() .

Rafal Borowiec
quelle
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);
nick w.
quelle
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]);
    }
Panchal Nilkanth
quelle
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;
}
Denis Fedak
quelle