1219 Stimmen

ArrayList<String> in String[]-Array umwandeln

Ich arbeite in der Android-Umgebung und habe den folgenden Code ausprobiert, aber er scheint nicht zu funktionieren.

String [] stockArr = (String[]) stock_list.toArray();

Wenn ich wie folgt definiere:

String [] stockArr = {"hello", "world"};

es funktioniert. Gibt es etwas, das ich übersehe?

22voto

Rick Hanlon II Punkte 18593

Die korrekte Vorgehensweise ist:

String[] stockArr = stock_list.toArray(new String[stock_list.size()]);

Ich möchte mich den anderen guten Antworten hier anschließen und erklären, wie Sie die Javadocs zur Beantwortung Ihrer Frage hätten verwenden können.

Der Javadoc für toArray() (keine Argumente) ist aquí . Wie Sie sehen können, gibt diese Methode ein Object[] y no String[] das ein Array des Laufzeittyps Ihrer Liste ist:

public Object[] toArray()

Gibt ein Array zurück, das alle Elemente in dieser Sammlung enthält. Wenn die Sammlung irgendwelche Garantien bezüglich in welcher Reihenfolge ihre Elemente von ihrem Iterator zurückgegeben werden, muss diese Methode die Elemente in der gleichen Reihenfolge zurückgeben. Das zurückgegebene Array ist "sicher", da die Sammlung keine Verweise auf es verwaltet. (Mit anderen Worten, diese Methode muss ein neues Array zuweisen, auch wenn die Sammlung durch ein Array unterstützt wird). Dem Aufrufer steht es daher frei, das das zurückgegebene Array.

Direkt unter dieser Methode steht jedoch die Javadoc para toArray(T[] a) . Wie Sie sehen können, gibt diese Methode eine T[] donde T ist der Typ des Arrays, das Sie übergeben. Auf den ersten Blick scheint dies das zu sein, wonach Sie suchen, aber es ist unklar, warum genau Sie ein Array übergeben (fügen Sie es hinzu, verwenden Sie es nur für den Typ usw.). Die Dokumentation macht deutlich, dass der Zweck des übergebenen Arrays im Wesentlichen darin besteht, den Typ des zurückzugebenden Arrays zu definieren (was genau Ihr Anwendungsfall ist):

public <T> T[] toArray(T[] a)

Gibt ein Array zurück, das alle Elemente in dieser Sammlung enthält; der Laufzeittyp von t der des angegebenen Arrays. Wenn die Sammlung fi Array passt, wird sie darin zurückgegeben. Andernfalls wird ein neues Array zugewiesen mit dem Laufzeittyp des angegebenen Arrays und der Größe dieser Sammlung. Wenn die Sammlung in das angegebene Array passt und noch Platz für passt (d.h. das Array hat mehr Elemente als die Sammlung), wird das Element in dem Array unmittelbar nach dem Ende der Sammlung auf Null gesetzt. Dies ist nützlich bei der Bestimmung der Länge der Auflistung nur dann nützlich, wenn der Aufrufer weiß, dass die Auflistung keine keine Nullelemente enthält).

Wenn diese Sammlung irgendwelche Garantien hinsichtlich der Reihenfolge ihrer Elemente gibt von ihrem Iterator zurückgegeben werden, muss diese Methode die Elemente in der gleichen Reihenfolge zurückgeben.

Diese Implementierung prüft, ob das Array groß genug ist, um die Sammlung zu enthalten; falls nicht, wird ein neues Array mit der richtigen Größe zugewiesen und Typs (unter Verwendung von Reflection). Dann wird über die Sammlung iteriert, und speichert jede Objektreferenz im nächstfolgenden Element der Arrays, beginnend mit Element 0. Wenn das Array größer ist als die Auflistung, wird eine Null an der ersten Stelle nach dem Ende der der Auflistung gespeichert.

Natürlich ist ein Verständnis der Generika (wie in den anderen Antworten beschrieben) erforderlich, um den Unterschied zwischen diesen beiden Methoden wirklich zu verstehen. Wenn Sie sich jedoch zunächst die Javadocs ansehen, werden Sie in der Regel Ihre Antwort finden und dann selbst sehen, was Sie noch lernen müssen (falls Sie das wirklich tun).

Beachten Sie auch, dass die Lektüre der Javadocs hier hilft Ihnen zu verstehen, was die Struktur des Arrays Sie in übergeben werden sollte. Auch wenn es praktisch keine Rolle spielt, sollten Sie kein leeres Array wie dieses übergeben:

String [] stockArr = stockList.toArray(new String[0]);  

Denn laut Dokumentation prüft diese Implementierung, ob das Array groß genug ist, um die Sammlung zu enthalten; wenn nicht, wird ein neues Array der richtigen Größe und des richtigen Typs (unter Verwendung von Reflection) angelegt. Es gibt keine Notwendigkeit für den zusätzlichen Overhead bei der Erstellung eines neuen Arrays, wenn Sie einfach in der Größe übergeben könnte.

Wie üblich bieten die Javadocs eine Fülle von Informationen und Anleitungen.

Hey, Moment mal, was ist eine Reflexion?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X