Ich versuche, alle Elemente von a auszudrucken List
, aber es wird Object
eher der Zeiger als der Wert gedruckt .
Dies ist mein Druckcode ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Könnte mir bitte jemand helfen, warum der Wert der Elemente nicht gedruckt wird.
List
? Zeigen Sie uns, wie Sie es deklariert und instanziiert haben.for (Object obj : list) {System.out.println(obj);}
.Antworten:
Hier ist ein Beispiel zum Ausdrucken der Listenkomponente:
quelle
Model
Klasse mit der Frage zusammen?Das Folgende ist kompakt und vermeidet die Schleife in Ihrem Beispielcode (und gibt Ihnen schöne Kommas):
Wie andere bereits betont haben, erhalten Sie die Objektzeiger (tatsächlich Hash-Codes), die Sie beobachten, wenn für die Objekte in der Liste keine sinnvollen toString () -Methoden implementiert sind. Dies gilt unabhängig davon, ob sie in einer Liste enthalten sind oder nicht.
quelle
list.toString()
.toString
, druckt Ihre Lösung auch den Klassennamen und den Hashcode.Arrays
Methode ist hilfreich für Arrays, wird jedoch jetzt nicht für Unterklassen von benötigtAbstractCollection
.Seit Java 8 erbt List eine Standardmethode "forEach", die Sie wie folgt mit der Methodenreferenz "System.out :: println" kombinieren können:
quelle
println
Ausgabe anzuhängen oder voranzustellen ?toString()
ofAbstractCollection
wird sauber und einfach genug sein, um das zu tun .AbstractList
ist eine Unterklasse vonAbstractCollection
, daher ist keine for-Schleife und kein toArray () erforderlich.Wenn Sie ein benutzerdefiniertes Objekt in Ihrer Liste verwenden, z. B. Student, müssen Sie dessen
toString()
Methode überschreiben (es ist immer gut, diese Methode zu überschreiben), um eine aussagekräftige Ausgabe zu erhaltenSiehe das folgende Beispiel:
Ausgabe:
quelle
list
:List -> Collection -> Iterable -> Object
. Die Klasse, die tatsächlich von AbstractCollection erbt, istArrayList
. Wenn in diesem BeispieltoString()
aufgerufen wird, findet es dieArrayList
Implementierung, die in definiert istAbstractCollection
. Beachten Sie die Vererbungshierarchie fürArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
Der Java 8 Streams Ansatz ...
quelle
Die Objekte in der Liste müssen
toString
implementiert sein, damit sie etwas drucken können, das für den Bildschirm von Bedeutung ist.Hier ist ein kurzer Test, um die Unterschiede zu erkennen:
Wenn dies ausgeführt wird, werden folgende Ergebnisse auf dem Bildschirm gedruckt:
Da T1 die toString-Methode nicht überschreibt, wird ihre Instanz t1 als etwas ausgegeben, das nicht sehr nützlich ist. Auf der anderen Seite überschreibt T2String, sodass wir steuern, was gedruckt wird, wenn es in E / A verwendet wird, und auf dem Bildschirm etwas Besseres sehen.
quelle
Stellen Sie sich eine vor,
List<String> stringList
die mit Java 8- Konstrukten auf viele Arten gedruckt werden kann :Wie unterscheiden sich diese Ansätze voneinander?
Erster Ansatz (
Iterable.forEach
) - Der Iterator der Sammlung wird im Allgemeinen verwendet und ist ausfallsicher ausgelegt. Dies bedeutet, dass er ausgelöst wird,ConcurrentModificationException
wenn die zugrunde liegende Sammlung während der Iteration strukturell geändert wird. Wie im Dokument erwähnt fürArrayList
:Dies bedeutet, dass das
ArrayList.forEach
Einstellen des Werts ohne Probleme zulässig ist. Und im Falle einer gleichzeitigen Erfassung wäre beispielsweiseConcurrentLinkedQueue
der Iterator schwach konsistent, was bedeutet, dass die übergebenen Aktionen ausnahmslosforEach
sogar strukturelle Änderungen vornehmen dürfenConcurrentModificationException
. Aber hier können die Änderungen in dieser Iteration sichtbar sein oder nicht.Zweiter Ansatz (
Stream.forEach
) - Die Reihenfolge ist undefiniert. Es kann zwar nicht für sequentielle Streams auftreten, aber die Spezifikation garantiert dies nicht. Außerdem muss die Aktion nicht störend wirken. Wie in doc erwähnt :Dritter Ansatz (
Stream.forEachOrdered
) - Die Aktion wird in der Reihenfolge der Begegnung des Streams ausgeführt. Also, wann immer es auf Bestellung ankommt,forEachOrdered
ohne einen zweiten Gedanken zu verwenden. Wie im Dokument erwähnt :Während der Iteration über eine synchronisierte Sammlung würde der erste Ansatz die Sperre der Sammlung einmal aufheben und sie über alle Aufrufe der Aktionsmethode hinweg halten. Bei Streams wird jedoch der Spliterator der Sammlung verwendet, der nicht sperrt und sich auf die bereits festgelegten Regeln von non stützt -Interferenz. Wenn das Sichern der Sammlung während der Iteration geändert wird, wird ein
ConcurrentModificationException
Wert ausgelöst oder es kann zu einem inkonsistenten Ergebnis kommen.Vierter Ansatz (parallel
Stream.forEach
) - Wie bereits erwähnt, keine Garantie, die bei parallelen Streams erwartete Reihenfolge der Begegnungen einzuhalten. Es ist möglich, dass Aktionen in verschiedenen Threads für verschiedene Elemente ausgeführt werden, was bei niemals der Fall sein kannforEachOrdered
.Fünfter Ansatz (parallel
Stream.forEachOrdered
) - DerforEachOrdered
verarbeitet die Elemente in der von der Quelle angegebenen Reihenfolge, unabhängig davon, ob der Stream sequentiell oder parallel ist. Es macht also keinen Sinn, dies mit parallelen Streams zu verwenden.quelle
Oder Sie können einfach die Apache Commons-Dienstprogramme verwenden:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
quelle
Verwenden Sie
String.join()
zum Beispiel:quelle
Ich habe ähnliche Probleme gehabt. Mein Code:
Weg 1: Drucken einer Liste in einer for-Schleife
Weg 2: Drucken der Liste in einer forEach, for-Schleife
Weg 3: Drucken der Liste in Java 8
quelle
Wenn es sich bei den Elementen jedoch um Objekte handelt, müssen Sie, wie Kshitij Mehta erwähnt hat, die Methode "toString" in diesem Objekt implementieren (überschreiben) - sofern sie noch nicht implementiert ist - und sie aus dem Objekt eine vollständige Bedeutung zurückgeben lassen. Beispiel:
quelle
System.out.println(list);
funktioniert bei mir.Hier ist ein vollständiges Beispiel:
Es wird gedruckt
[Hello, World]
.quelle
Für eine Liste von Array von String
quelle
Ich habe eine Dump-Funktion geschrieben, die grundsätzlich die öffentlichen Mitglieder eines Objekts druckt, wenn es nicht zu String () überschrieben wurde. Man könnte es leicht erweitern, um Getter zu nennen. Javadoc:
quelle
For-Schleife zum Drucken des Inhalts einer Liste:
Ergebnis:
Wenn Sie in einer einzelnen Zeile drucken möchten (nur zur Information):
Ergebnis:
quelle
quelle
x
und in welcher Beziehung steht er zur Frage des OP?Ich arbeite gerade daran ...
quelle
Dies hängt davon ab, welche Art von Objekten in der Methode gespeichert
List
ist und ob eine Implementierung für dietoString()
Methode vorhanden ist.System.out.println(list)
drucken alle Standard - Java - Objekttypen sollten (String
,Long
,Integer
usw.). Wenn wir benutzerdefinierte Objekttypen verwenden, müssen wir dieoverride
toString()
Methode unseres benutzerdefinierten Objekts verwenden.Beispiel:
Prüfung:
quelle
quelle
Versuchen Sie, die toString () -Methode so zu überschreiben, wie Sie möchten, dass das Element gedruckt wird. Die Druckmethode kann also folgende sein:
quelle
toString
ist implizit.quelle