Estoy tratando de imprimir todos los elementos de un List
, sin embargo, está imprimiendo el puntero delObject
valor en lugar del valor.
Este es mi código de impresión ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
¿Podría alguien ayudarme por qué no está imprimiendo el valor de los elementos?
List
ser? Muéstranos cómo lo declaraste y lo instanciaste.for (Object obj : list) {System.out.println(obj);}
.Respuestas:
Aquí hay un ejemplo sobre cómo imprimir el componente de la lista:
fuente
Model
clase con la pregunta?Lo siguiente es compacto y evita el bucle en su código de ejemplo (y le da buenas comas):
Sin embargo, como otros han señalado, si no tiene implementados métodos toString () sensibles para los objetos dentro de la lista, obtendrá los punteros de objetos (códigos hash, de hecho) que está observando. Esto es cierto si están en una lista o no.
fuente
list.toString()
?toString
, su solución también imprimirá su nombre de clase y código hash.Arrays
método es útil para las matrices, pero ahora no es necesario para las subclases deAbstractCollection
.Desde Java 8, List hereda un método "forEach" predeterminado que puede combinar con la referencia de método "System.out :: println" de esta manera:
fuente
println
salida?toString()
deAbstractCollection
será lo suficientemente limpia y fácil de hacer eso .AbstractList
es una subclase deAbstractCollection
, por lo que no se necesita bucle ni toArray ().Si está utilizando algún objeto personalizado en su lista, por ejemplo, Estudiante, debe anular su
toString()
método (siempre es bueno anular este método) para tener una salida significativaVea el siguiente ejemplo:
salida:
fuente
list
:List -> Collection -> Iterable -> Object
. La clase que realmente hereda de AbstractCollection esArrayList
. Entonces, en este ejemplo, cuandotoString()
se llama encuentra laArrayList
implementación que se define enAbstractCollection
. Tenga en cuenta la jerarquía de herencia paraArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
El enfoque de Java 8 Streams ...
fuente
Los objetos en la lista deben haberse
toString
implementado para que impriman algo significativo en la pantalla.Aquí hay una prueba rápida para ver las diferencias:
Y cuando esto se ejecuta, los resultados impresos en la pantalla son:
Como T1 no anula el método toString, su instancia t1 se imprime como algo que no es muy útil. Por otro lado, T2 anula a String, por lo que controlamos lo que imprime cuando se usa en E / S, y vemos algo un poco mejor en la pantalla.
fuente
Considere una
List<String> stringList
que se puede imprimir de muchas maneras usando construcciones Java 8 :¿En qué se diferencian estos enfoques entre sí?
Primer enfoque (
Iterable.forEach
): el iterador de la colección generalmente se usa y está diseñado para fallar rápidamente, lo que significa que se lanzaráConcurrentModificationException
si la colección subyacente se modifica estructuralmente durante la iteración. Como se menciona en el documento paraArrayList
:Por lo tanto, significa
ArrayList.forEach
que el valor está permitido sin ningún problema. Y en el caso de una recopilación simultánea, por ejemplo,ConcurrentLinkedQueue
el iterador sería débilmente consistente, lo que significa que las acciones aprobadasforEach
pueden realizar incluso cambios estructurales sin que se produzca unaConcurrentModificationException
excepción. Pero aquí las modificaciones pueden o no ser visibles en esa iteración.Segundo enfoque (
Stream.forEach
): el orden no está definido. Aunque puede que no ocurra para secuencias secuenciales, la especificación no lo garantiza. También se requiere que la acción sea de naturaleza no interferente. Como se menciona en el documento :Tercer enfoque (
Stream.forEachOrdered
): la acción se realizaría en el orden de encuentro de la secuencia. Por lo tanto, cuando el orden importa se usaforEachOrdered
sin pensarlo dos veces. Como se menciona en el documento :Mientras itera sobre una colección sincronizada, el primer enfoque tomaría el bloqueo de la colección una vez y lo mantendría en todos los métodos de llamadas a la acción, pero en el caso de las transmisiones, usan el spliterator de la colección, que no se bloquea y se basa en las reglas establecidas de no -interferencia. En caso de que la copia de respaldo de la secuencia se modifique durante la iteración, un
ConcurrentModificationException
, se generará un resultado incoherente.Cuarto enfoque (paralelo
Stream.forEach
): como ya se mencionó, no hay garantía de respetar el orden de encuentro como se esperaba en el caso de flujos paralelos. Es posible que la acción se realice en diferentes hilos para diferentes elementos que nunca pueden ser el casoforEachOrdered
.Quinta Approach (Parallel
Stream.forEachOrdered
) - ElforEachOrdered
procesará los elementos en el orden especificado por la fuente con independencia del hecho de si la corriente es secuencial o en paralelo. Por lo tanto, no tiene sentido usar esto con flujos paralelos.fuente
O simplemente puede usar las utilidades de Apache Commons:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
fuente
Use
String.join()
por ejemplo:fuente
Me he enfrentado a problemas similares. Mi código:
Forma 1: imprimir una lista en un ciclo for
Modo 2: imprimir la lista en forEach, for loop
Camino 3: imprimir la lista en java 8
fuente
Pero si los elementos son objetos, como Kshitij Mehta mencionó, debe implementar (anular) el método "toString" dentro de ese objeto, si aún no está implementado, y dejar que devuelva algo que significa completo desde dentro del objeto, por ejemplo:
fuente
System.out.println(list);
funciona para mi.Aquí hay un ejemplo completo:
Se imprimirá
[Hello, World]
.fuente
Para obtener una lista de la matriz de cadenas
fuente
Escribí una función de volcado, que básicamente imprime los miembros públicos de un objeto si no ha anulado aString (). Se podría expandir fácilmente para llamar a los captadores. Javadoc:
fuente
Para bucle para imprimir el contenido de una lista:
Resultado:
Si desea imprimir en una sola línea (solo para información):
Resultado:
fuente
fuente
x
y cómo se relaciona con la pregunta del OP?Estoy trabajando en esto ahora ...
fuente
Depende de qué tipo de objetos almacenados en el
List
, y si tiene implementación para eltoString()
método.System.out.println(list)
debe imprimir todos los tipos de objetos de Java estándar (String
,Long
,Integer
etc.). En el caso, si estamos utilizando tipos de objetos personalizados, entonces necesitamosoverride
toString()
método de nuestro objeto personalizado.Ejemplo:
Prueba:
fuente
fuente
intente anular el método toString () ya que desea que el elemento sea printend. entonces el método para imprimir puede ser este:
fuente
toString
es implícita.fuente