Estou tentando imprimir todos os elementos de a List
, no entanto, ele está imprimindo o ponteiro do Object
valor e não do valor.
Este é o meu código de impressão ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Alguém poderia me ajudar por que não está imprimindo o valor dos elementos.
List
ser? Mostre-nos como você o declarou e instanciaram.for (Object obj : list) {System.out.println(obj);}
.Respostas:
Aqui está um exemplo de como imprimir o componente da lista:
fonte
Model
turma está relacionada à pergunta?O seguinte é compacto e evita o loop no seu código de exemplo (e fornece boas vírgulas):
No entanto, como outros salientaram, se você não possui métodos sensíveis toString () implementados para os objetos dentro da lista, receberá os ponteiros do objeto (na verdade, códigos de hash) que está observando. Isso é verdade se eles estão em uma lista ou não.
fonte
list.toString()
.toString
, sua solução também imprimirá seu nome de classe e código de hash.Arrays
método é útil para matrizes, mas agora não é necessário para subclasses deAbstractCollection
.Desde o Java 8, a List herda um método "forEach" padrão, que você pode combinar com a referência do método "System.out :: println", assim:
fonte
println
saída?toString()
deAbstractCollection
será limpo e fácil o suficiente para fazer isso .AbstractList
é uma subclasse deAbstractCollection
, portanto , não é necessário fazer loop e nem toArray ().Se você estiver usando qualquer objeto personalizado em sua lista, diga Aluno, precisará substituir seu
toString()
método (é sempre bom substituir esse método) para obter uma saída significativaVeja o exemplo abaixo:
resultado:
fonte
list
:List -> Collection -> Iterable -> Object
. A classe que realmente herda de AbstractCollection éArrayList
. Portanto, neste exemplo, quandotoString()
é chamado, encontra aArrayList
implementação definida emAbstractCollection
. Observe a hierarquia de herança paraArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
A abordagem do Java 8 Streams ...
fonte
Os objetos na lista devem ter sido
toString
implementados para que eles imprimam algo significativo na tela.Aqui está um teste rápido para ver as diferenças:
E quando isso é executado, os resultados impressos na tela são:
Como T1 não substitui o método toString, sua instância t1 é impressa como algo que não é muito útil. Por outro lado, o T2 substitui o ToString, por isso controlamos o que é impresso quando usado em E / S e vemos algo um pouco melhor na tela.
fonte
Considere um
List<String> stringList
que pode ser impresso de várias maneiras usando construções Java 8 :Como essas abordagens são diferentes umas das outras?
Primeira abordagem (
Iterable.forEach
) - o iterador da coleção geralmente é usado e é projetado para ser rápido, o que significa que será lançadoConcurrentModificationException
se a coleção subjacente for estruturalmente modificada durante a iteração. Conforme mencionado no documento paraArrayList
:Então, isso significa
ArrayList.forEach
que a definição do valor é permitida sem nenhum problema. E no caso de coleta simultânea, por exemplo,ConcurrentLinkedQueue
o iterador seria fracamente consistente, o que significa que as ações transmitidasforEach
podem fazer alterações estruturais mesmo sem queConcurrentModificationException
sejam lançadas exceções. Mas aqui as modificações podem ou não ser visíveis nessa iteração.Segunda abordagem (
Stream.forEach
) - o pedido não está definido. Embora possa não ocorrer para fluxos sequenciais, mas a especificação não garante isso. Também é necessário que a ação seja de natureza não interferente. Como mencionado no doc :Terceira abordagem (
Stream.forEachOrdered
) - a ação seria executada na ordem de encontro do fluxo. Portanto, sempre que a ordem importa, useforEachOrdered
sem pensar duas vezes. Conforme mencionado no documento :Ao iterar sobre uma coleção sincronizada, a primeira abordagem retira o bloqueio da coleção uma vez e o mantém em todas as chamadas para o método de ação, mas no caso de fluxos, eles usam o spliterator da coleção, que não bloqueia e depende das regras já estabelecidas de -interferência. Caso a coleta de backup do fluxo seja modificada durante a iteração
ConcurrentModificationException
, será lançado um resultado inconsistente.Quarta Abordagem (Paralela
Stream.forEach
) - Como já mencionado, não há garantia de respeitar a ordem do encontro como esperado no caso de fluxos paralelos. É possível que a ação seja executada em um encadeamento diferente para diferentes elementos que nunca podem ser o casoforEachOrdered
.Quinto Approach (paralela
Stream.forEachOrdered
) - AforEachOrdered
vai processar os elementos na ordem especificada pela fonte, independentemente do facto de se transmitir é sequencial ou paralelo. Portanto, não faz sentido usar isso com fluxos paralelos.fonte
Ou você pode simplesmente usar os utilitários do Apache Commons:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
fonte
Use
String.join()
por exemplo:fonte
Eu enfrentei problemas semelhantes. Meu código:
Caminho 1: imprimir uma lista em um loop for
Caminho 2: imprimindo a lista em um loop forEach, for
Caminho 3: imprimindo a lista em java 8
fonte
Mas se os elementos são objetos, como Kshitij Mehta mencionou, é necessário implementar (substituir) o método "toString" dentro desse objeto - se ainda não estiver implementado - e permitir que ele retorne algo significativo dentro do objeto, por exemplo:
fonte
System.out.println(list);
funciona para mim.Aqui está um exemplo completo:
Ele será impresso
[Hello, World]
.fonte
Para uma lista da matriz de String
fonte
Eu escrevi uma função de despejo, que basicamente imprime os membros públicos de um objeto se ele não substituiu toString (). Pode-se expandi-lo facilmente para chamar getters. Javadoc:
fonte
For loop para imprimir o conteúdo de uma lista:
Resultado:
Se você deseja imprimir em uma única linha (apenas para obter informações):
Resultado:
fonte
fonte
x
e como está relacionado à pergunta do OP?Eu estou trabalhando nisso agora ...
fonte
Depende de que tipo de objetos armazenados no
List
e se tem implementação para otoString()
método.System.out.println(list)
deve imprimir todos os tipos de objetos Java padrão (String
,Long
,Integer
etc). No caso, se estivermos usando tipos de objetos personalizados, precisamosoverride
toString()
método do nosso objeto personalizado.Exemplo:
Teste:
fonte
fonte
tente substituir o método toString () como desejar que o elemento seja impresso. então o método para imprimir pode ser este:
fonte
toString
está implícita.fonte