Я пытаюсь распечатать все элементы List
, но он печатает указатель, Object
а не значение.
Это мой печатный код ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Может ли кто-нибудь, пожалуйста, помогите мне, почему он не печатает значение элементов.
List
быть? Покажите нам, как вы объявили и создали его экземпляр.for (Object obj : list) {System.out.println(obj);}
.Ответы:
Вот несколько примеров получения распечатки компонента списка:
источник
Model
класса связано с вопросом?Следующее компактно и позволяет избежать цикла в вашем примере кода (и дает вам хорошие запятые):
Однако, как отмечали другие, если у вас нет разумных методов toString (), реализованных для объектов внутри списка, вы получите указатели объектов (фактически, хеш-коды), которые вы наблюдаете. Это верно, находятся ли они в списке или нет.
источник
list.toString()
.toString
, ваше решение также напечатает его имя класса и хэш-код.Arrays
метод полезен для массивов, но не нужен для подклассовAbstractCollection
.Начиная с Java 8, List наследует метод «forEach» по умолчанию, который можно объединить со ссылкой на метод «System.out :: println» следующим образом:
источник
println
вывода?toString()
изAbstractCollection
будет чистой и достаточно легко , чтобы сделать это .AbstractList
является подклассомAbstractCollection
, так что нет необходимости для цикла for и не нужно toArray ().Если вы используете какой-либо пользовательский объект в своем списке, скажем «Студент», вам нужно переопределить его
toString()
метод (всегда полезно переопределить этот метод), чтобы получить значимый выводСмотрите пример ниже:
вывод:
источник
list
:List -> Collection -> Iterable -> Object
. Класс, который на самом деле наследует от AbstractCollectionArrayList
. Таким образом, в этом примере, когдаtoString()
вызывается, он находитArrayList
реализацию, которая определена вAbstractCollection
. Обратите внимание на иерархию наследования дляArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
Подход Java 8 Streams ...
источник
Должны быть
toString
реализованы объекты в списке, чтобы они могли выводить что-то значимое на экран.Вот быстрый тест, чтобы увидеть различия:
И когда это выполняется, результаты выводятся на экран:
Поскольку T1 не переопределяет метод toString, его экземпляр t1 распечатывается как нечто, что не очень полезно. С другой стороны, T2 переопределяет toString, поэтому мы контролируем, что он печатает, когда он используется в I / O, и мы видим что-то немного лучше на экране.
источник
Рассмотрим,
List<String> stringList
что может быть напечатано разными способами с использованием конструкций Java 8 :Чем эти подходы отличаются друг от друга?
Первый подход (
Iterable.forEach
). Обычно используется итератор коллекции, который рассчитан на отказоустойчивость, что означает, что он будет генерировать,ConcurrentModificationException
если базовая коллекция будет структурно изменена во время итерации. Как уже упоминалось в документе дляArrayList
:Таким образом, это означает, что для
ArrayList.forEach
установки значения допускается без каких-либо проблем. И в случае одновременного сбора, например,ConcurrentLinkedQueue
итератор будет слабосогласованным, что означает, что переданные действияforEach
могут вносить даже структурные изменения безConcurrentModificationException
исключения. Но здесь изменения могут или не могут быть видны в этой итерации.Второй подход (
Stream.forEach
) - порядок не определен. Хотя это может не произойти для последовательных потоков, но спецификация не гарантирует этого. Также действие должно быть не вмешивающимся в природу. Как уже упоминалось в документе :Третий подход (
Stream.forEachOrdered
) - действие будет выполняться в порядке встречи потока. Так что всякий раз, когда порядок вещей имеет значение,forEachOrdered
не задумываясь. Как уже упоминалось в документе :В то время как итерация по синхронному коллекции с первым подходом бы заблокировать коллекцию раз и проведут его через все вызовы к методу действия, но в случае потоков , которые они используют spliterator коллекции, которая не блокирует и опирается на уже установленные правилах неправительственного -interference. В случае, если поддержка итерации потока изменяется во время итерации,
ConcurrentModificationException
может быть выброшено или может возникнуть противоречивый результат.Четвертый подход (параллельный
Stream.forEach
) - как уже упоминалось, нет гарантии соблюдения порядка встречи, как ожидается в случае параллельных потоков. Возможно, что действие выполняется в разных потоках для разных элементов, что никогда не может иметь местоforEachOrdered
.Пятый подход (параллельный
Stream.forEachOrdered
) -forEachOrdered
будет обрабатывать элементы в порядке , указанном источнике , независимо от того , является ли последовательный или параллельный поток. Поэтому нет смысла использовать это с параллельными потоками.источник
Или вы можете просто использовать утилиты Apache Commons:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
источник
Используйте,
String.join()
например:источник
Я столкнулся с похожими проблемами. Мой код:
Способ 1: печать списка в цикле for
Способ 2: печать списка в forEach, для цикла
Способ 3: печать списка в Java 8
источник
Но если элементы являются объектами, то, как упомянул Кшидж Мехта, вам нужно реализовать (переопределить) метод "toString" в этом объекте - если он еще не реализован - и позволить ему возвращать что-то полное изнутри объекта, например:
источник
System.out.println(list);
работает для меня.Вот полный пример:
Это будет печатать
[Hello, World]
.источник
Для списка массив строк
источник
Я написал функцию дампа, которая в основном распечатывает открытые члены объекта, если он не переопределил toString (). Можно легко расширить это, чтобы вызвать добытчиков. Javadoc:
источник
Цикл For для печати содержимого списка:
Результат:
Если вы хотите печатать в одну строку (только для информации):
Результат:
источник
источник
x
и как это связано с вопросом ОП?Я сейчас работаю над этим ...
источник
Это зависит от того, какой тип объектов хранится в
List
, и имеет ли он реализацию дляtoString()
метода.System.out.println(list)
должен печатать все стандартные типы объектов Java (String
,Long
, иInteger
т.д.). В случае, если мы используем пользовательские типы объектов, то нам нужноoverride
toString()
метод нашего пользовательского объекта.Пример:
Тест:
источник
источник
попробуйте переопределить метод toString (), так как вы хотите, чтобы элемент был printend. поэтому метод печати может быть таким:
источник
toString
неявным.источник