J'essaie d'imprimer tous les éléments d'un List
, mais il imprime le pointeur du Object
plutôt que la valeur.
Ceci est mon code d'impression ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Quelqu'un pourrait-il m'aider à comprendre pourquoi il n'imprime pas la valeur des éléments.
List
être? Montrez-nous comment vous l'avez déclaré et instancié.for (Object obj : list) {System.out.println(obj);}
.Réponses:
Voici quelques exemples pour imprimer le composant liste:
la source
Model
lien entre l'introduction de la classe et la question?Ce qui suit est compact et évite la boucle dans votre exemple de code (et vous donne de belles virgules):
Cependant, comme d'autres l'ont souligné, si vous n'avez pas de méthodes toString () implémentées pour les objets de la liste, vous obtiendrez les pointeurs d'objet (codes de hachage, en fait) que vous observez. Cela est vrai, qu'ils soient dans une liste ou non.
la source
list.toString()
.toString
, votre solution imprime également son nom de classe et son code de hachage.Arrays
méthode est utile pour les tableaux, mais n'est plus nécessaire pour les sous-classes deAbstractCollection
.Depuis Java 8, List hérite d'une méthode "forEach" par défaut que vous pouvez combiner avec la référence de méthode "System.out :: println" comme ceci:
la source
println
sortie?toString()
deAbstractCollection
sera propre et assez facile à faire .AbstractList
est une sous-classe deAbstractCollection
, donc pas besoin de boucle et aucun toArray () n'est nécessaire.Si vous utilisez un objet personnalisé dans votre liste, par exemple Student, vous devez remplacer sa
toString()
méthode (il est toujours bon de remplacer cette méthode) pour avoir une sortie significativeVoir l'exemple ci-dessous:
production:
la source
list
:List -> Collection -> Iterable -> Object
. La classe qui hérite réellement de AbstractCollection estArrayList
. Ainsi, dans cet exemple, lorsquetoString()
est appelé, il trouve l'ArrayList
implémentation définie dansAbstractCollection
. Notez la hiérarchie d'héritage pourArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
L'approche Java 8 Streams ...
la source
Les objets de la liste doivent avoir
toString
implémenté pour qu'ils puissent imprimer quelque chose de significatif à l'écran.Voici un test rapide pour voir les différences:
Et lorsque cela s'exécute, les résultats imprimés à l'écran sont:
Puisque T1 ne remplace pas la méthode toString, son instance t1 s'affiche comme quelque chose qui n'est pas très utile. D'un autre côté, T2 remplace toString, nous contrôlons donc ce qu'il imprime lorsqu'il est utilisé dans les E / S, et nous voyons quelque chose d'un peu mieux à l'écran.
la source
Considérez un
List<String> stringList
qui peut être imprimé de plusieurs façons en utilisant des constructions Java 8 :En quoi ces approches sont-elles différentes les unes des autres?
Première approche (
Iterable.forEach
) - L'itérateur de la collection est généralement utilisé et il est conçu pour être infaillible, ce qui signifie qu'il sera lancéConcurrentModificationException
si la collection sous-jacente est structurellement modifiée pendant l'itération. Comme mentionné dans le doc pourArrayList
:Cela signifie donc que la
ArrayList.forEach
définition de la valeur est autorisée sans aucun problème. Et en cas de collecte simultanée, par exemple,ConcurrentLinkedQueue
l'itérateur serait faiblement cohérent, ce qui signifie que les actions transmisesforEach
sont autorisées à effectuer des changements structurels réguliers sansConcurrentModificationException
exception. Mais ici, les modifications peuvent être visibles ou non dans cette itération.Deuxième approche (
Stream.forEach
) - L'ordre n'est pas défini. Bien que cela ne puisse pas se produire pour les flux séquentiels, la spécification ne le garantit pas. L'action doit également être de nature non interférente. Comme mentionné dans le doc :Troisième approche (
Stream.forEachOrdered
) - L'action serait exécutée dans l'ordre de rencontre du flux. Donc, chaque fois que l'ordre compte, utilisezforEachOrdered
sans arrière-pensée. Comme mentionné dans le doc :Lors de l'itération sur une collection synchronisée, la première approche prendrait le verrou de la collection une fois et le maintiendrait sur tous les appels à la méthode d'action, mais dans le cas des flux, ils utilisent le séparateur de la collection, qui ne se verrouille pas et s'appuie sur les règles de non -ingérence. Dans le cas où la collection sauvegardant le flux est modifiée pendant l'itération, un résultat
ConcurrentModificationException
serait levé ou un résultat incohérent pourrait se produire.Quatrième approche (parallèle
Stream.forEach
) - Comme déjà mentionné, aucune garantie de respecter l'ordre de rencontre comme prévu en cas de flux parallèles. Il est possible que l'action soit effectuée dans différents threads pour différents éléments, ce qui ne peut jamais être le casforEachOrdered
.Cinquième approche (parallèle
Stream.forEachOrdered
) - LeforEachOrdered
traitera les éléments dans l'ordre spécifié par la source, que le flux soit séquentiel ou parallèle. Cela n'a donc aucun sens de l'utiliser avec des flux parallèles.la source
Ou vous pouvez simplement utiliser les utilitaires Apache Commons:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
la source
Utilisez
String.join()
par exemple:la source
J'ai rencontré des problèmes similaires. Mon code:
Méthode 1: impression d'une liste dans une boucle for
Méthode 2: impression de la liste dans une boucle forEach, for
Méthode 3: impression de la liste en Java 8
la source
Mais si les éléments sont des objets, comme Kshitij Mehta l'a mentionné, vous devez implémenter (remplacer) la méthode "toString" au sein de cet objet - s'il n'est pas déjà implémenté - et le laisser renvoyer quelque chose de plein à l'intérieur de l'objet, exemple:
la source
System.out.println(list);
travaille pour moi.Voici un exemple complet:
Il s'imprimera
[Hello, World]
.la source
Pour une liste de tableau de String
la source
J'ai écrit une fonction de vidage, qui affiche simplement les membres publics d'un objet s'il n'a pas remplacé toString (). On pourrait facilement l'étendre pour appeler des getters. Javadoc:
la source
For loop pour imprimer le contenu d'une liste:
Résultat :
Si vous souhaitez imprimer sur une seule ligne (juste pour information):
Résultat :
la source
la source
x
et comment est-il lié à la question du PO?Il se trouve que je travaille là-dessus maintenant ...
la source
Cela dépend du type d'objets stockés dans le
List
, et s'il a une implémentation pour latoString()
méthode.System.out.println(list)
devrait imprimer tous les types standard de l' objet java (String
,Long
,Integer
etc.). Dans le cas, si nous utilisons des types d'objets personnalisés, nous devons alors utiliser laoverride
toString()
méthode de notre objet personnalisé.Exemple:
Tester:
la source
la source
essayez de remplacer la méthode toString () comme vous voulez que l'élément soit printend. donc la méthode pour imprimer peut être la suivante:
la source
toString
est implicite.la source