- Списки на Java – методы интерфейса List
- Учебное видео по спискам Java
- Java List и Set
- Реализация List
- Как вставить элементы в список Java
- Вставить нулевые значения
- Добавить элементы по определенному индексу
- Вставляем все элементы из одного списка в другой
- Получить элементы из списка Java
- Как найти элементы в списке Java
- Найти последнее вхождение элемента в списке
- Проверка: содержит ли список элемент?
- Как удалить элементы из списка Java
- Очистить список
- Как сохранить все элементы из одного списка в другом
- Узнать количество элементов
- Подсписок списка
- Преобразовать list в set
- Общие списки
- Сортировка
- Сортировка списка с помощью Comparatorimplementation
- Итерации
- Итерация списка с помощью итератора
- Итерация списка с использованием цикла For-Each
- Итерация списка с помощью цикла For
- Перебор списка с использованием API Java Stream
- Как распечатать все элементы списка на Java?
- 18 ответов
- как эти подходы отличаются друг от друга?
Списки на Java – методы интерфейса List
Интерфейс Java List, java.util.List, представляет упорядоченную последовательность объектов. Элементы, содержащиеся в списке Java, вставлять и удалять в соответствии с порядком их появления в списке.
Каждый элемент в списке Java имеет индекс. Первый элемент в имеет индекс 0, второй элемент имеет индекс 1 и т.д.
Вы можете добавить любой объект в список. Если список не типизирован с использованием Java Generics, то вы можете даже смешивать объекты разных типов (классов) в одном и том же списке.
Java List – это стандартный интерфейс, который является подтипом Java Collection, что означает, что означает, что List наследуется от Collection.
Учебное видео по спискам Java
Если вы предпочитаете смотреть видео вместо чтения текста, вот видео версия этого учебника по Java List:
Java List и Set
Java List и Java Set очень похожи в том, что они оба представляют коллекцию элементов. Тем не менее, есть некоторые существенные различия.
Первое различие между Java List и Java Set состоит в том, что один и тот же элемент может встречаться в списке более одного раза. Это отличается от набора, где каждый элемент может встречаться только один раз.
Второе различие – элементы в List имеют порядок, и элементы могут повторяться в этом порядке. Набор не предполагает порядок элементов, хранящихся внутри.
Реализация List
Будучи подтипом Collection, все методы в интерфейсе Collection также доступны в Listinterface.
Поскольку List – это интерфейс, вам необходимо создать конкретную реализацию интерфейса, чтобы использовать его. Вы можете выбирать между следующими реализациями List в API коллекций Java:
- java.util.ArrayList
- java.util.LinkedList
- java.util.Vector
- java.util.Stack
Также есть параллельные реализации List в пакете java.util.concurrent.
Вот несколько примеров того, как создать экземпляр List:
Как вставить элементы в список Java
Вставить элементы (объекты) в список Java можно методом add (). Вот пример добавления элементов в список Java:
Первые три вызова add () добавляют экземпляр String в конец списка.
Вставить нулевые значения
На самом деле возможно вставить даже нулевые значения в список.
Добавить элементы по определенному индексу
Можно добавить элемент в список по определенному индексу. Интерфейс List имеет версию метода add(), которая принимает индекс в качестве первого параметра, и элемент для вставки в качестве второго параметра. Вот пример вставки элемента с индексом 0.
Если список уже содержит элементы, то теперь они будут перемещаться дальше во внутренней последовательности. Элемент, который имел индекс 0 до того, как новый элемент был вставлен в индекс 0, будет перемещен в индекс 1 и т.д.
Вставляем все элементы из одного списка в другой
Можно добавить все элементы из одного списка в другой. Сделаем это с помощью метода ListaddAll (). Результат представляет собой объединение двух списков.
Этот пример добавляет все элементы из listSource в listDest.
Метод addAll () принимает набор в качестве параметра, поэтому в качестве параметра можно передать список или набор.
Получить элементы из списка Java
Вы можете получить элементы из списка Java, используя индекс элементов. Методом get (int index). Вот пример доступа к элементам списка с использованием индексов элементов:
Также возможно итерировать элементы списка в том порядке, в котором они хранятся внутри.
Как найти элементы в списке Java
Вы можете найти элементы в списке Java, используя один из этих двух методов:
- index()
- LastIndexOf ()Метод indexOf () находит индекс первого вхождения в списке заданного элемента.
Запуск этого кода приведет к следующему результату:
Найти последнее вхождение элемента в списке
Метод lastIndexOf () находит индекс последнего вхождения в списке данного элемента.
Результат, напечатанный при запуске приведенного выше примера будет таков:
Элемент 1 встречается 2 раза. Индекс последнего равен 2.
Проверка: содержит ли список элемент?
Вы можете проверить, содержит ли Java List данный элемент, используя метод List contains ().
Чтобы определить, содержит ли List этот элемент, List будет внутренне выполнять итерации своих элементов и сравнивать каждый элемент с объектом, переданным в качестве параметра.
Поскольку можно добавить нулевые значения в список, фактически можно проверить, содержит ли список нулевое значение.
Очевидно, что если входной параметр для contains () имеет значение null, метод contains () не будет использовать метод equals() для сравнения с каждым элементом, а вместо этого использует оператор ==.
Как удалить элементы из списка Java
Вы можете удалить элементы из списка Java с помощью этих двух методов:
- remove(Object element)
- remove(int index)
remove (Object element) удаляет элемент в списке, если он присутствует. Все последующие элементы, затем перемещаются вверх по списку. Таким образом, их индекс уменьшается на 1.
Этот пример сначала добавляет элемент, а затем снова удаляет его.
Метод List remove (int index) удаляет элемент по указанному индексу.
После выполнения этого примера кода список будет содержать элементы 1 и 2 с индексами 0 и 1.
Очистить список
Интерфейс Java List содержит метод clear (), который удаляет все элементы из списка при вызове. Удаление всех элементов также называется очисткой.
Как сохранить все элементы из одного списка в другом
Метод retainAll () способен сохранять все элементы из одного списка в другом. Другими словами, метод retain () удаляет все элементы, которые не найдены в другом списке.
Результатом является пересечение двух списков.
Узнать количество элементов
Вы можете получить количество элементов вызвав метод size (). Вот пример:
Подсписок списка
Метод subList () может создавать новый List с подмножеством элементов из исходного List.
Метод subList () принимает 2 параметра: начальный индекс и конечный индекс. Начальный индекс – это индекс первого элемента из исходного списка для включения в подсписок.
Конечный индекс является последним индексом подсписка, но элемент в последнем индексе не включается в подсписок. Это похоже на то, как работает метод подстроки Java String.
После выполнения list.subList (1,3) подсписок будет содержать элементы с индексами 1 и 2.
Помните, что исходный список содержит 4 элемента с индексами от 0 до 3. Вызов list.subList (1,3) будет включить индекс 1, но исключить индекс 3, сохраняя тем самым элементы с индексами 1 и 2.
Преобразовать list в set
Вы можете преобразовать список Java в набор(set), создав новый набор и добавив в него все элементы из списка. Набор удалит все дубликаты.
Таким образом, результирующий набор будет содержать все элементы списка, но только один раз.
Обратите внимание, что список содержит элемент String 3 два раза. Набор будет содержать эту строку только один раз. Таким образом, результирующий набор будет содержать строки: element 1 , element 2 and element 3 .
Общие списки
По умолчанию вы можете поместить любой объект в список, но Java позволяет ограничить типы объектов, которые вы можете вставить в список.
Этот список теперь может содержать только экземпляры MyObject. Затем вы можете получить доступ к итерации его элементов без их приведения.
Сортировка
Вы можете отсортировать список с помощью метода Collections sort ().
Если Список содержит объекты, которые реализуют интерфейс Comparable (java.lang.Comparable), тогда эти объекты можно сравнивать. В этом случае вы можете отсортировать список следующим образом:
Класс Java String реализует интерфейс Comparable, вы можете отсортировать их в естественном порядке, используя метод Collections sort ().
Сортировка списка с помощью Comparatorimplementation
Если объекты не реализуют интерфейс Comparable или если вы хотите отсортировать объекты в порядке, отличном от их реализации compare (), вам необходимо использовать Comparatorimplementation (java.util.Comparator).
Вот код сортировки:
Обратите внимание на реализацию Comparator в приведенном выше примере. Эта реализация сравнивает только поле марки автомобилей Car. Можно создать другую реализацию Comparator, которая сравнивает номерные знаки или даже количество дверей в автомобилях.
Возможно реализовать Comparator с использованием Java Lambda. Вот пример, который сортирует объекты List of Car с использованием трех различных реализаций интерфейса Comparator, каждая из которых сравнивает экземпляры Car по своему полю:
Итерации
Вы можете выполнить итерацию списка несколькими различными способами. Три наиболее распространенных способа:
- Использование итератора
- Использование цикла for-each
- Использование цикла for
- Использование API Java Stream
Итерация списка с помощью итератора
Первый способ итерации списка – использовать итератор Java.
Вызывая метод iterator () интерфейса List.
Вызов hasNext () выполняется внутри цикла while.
Внутри цикла while вы вызываете метод Iterator next () для получения следующего элемента, на который указывает Iterator.
Если список задан с использованием Java Generics, вы можете сохранить некоторые объекты внутри цикла while.
Итерация списка с использованием цикла For-Each
Второй способ итерации List – использовать цикл for.
Цикл for выполняется один раз для каждого элемента. Внутри цикла for каждый элемент, в свою очередь, связан с переменной obj.
Можно изменить тип переменной внутри цикла for.
Итерация списка с помощью цикла For
Третий способ итерации List – использовать стандартный цикл for, подобный следующему:
Цикл for создает переменную int и инициализирует ее 0. Затем она зацикливается, пока переменная int i меньше размера списка. Для каждой итерации переменная i увеличивается.
Внутри цикла for обращаемся к элементам List с помощью метода get (), передавая в качестве параметра переменную i.
Опять же, если список напечатан с использованием Java Generics, например, для для строки, то вы можете использовать универсальный тип списка в качестве типа для локальной переменной, которая присваивается каждому элементу списка во время итерации.
Тип локальной переменной внутри цикла for теперь String. Поскольку список обычно типизируется как String, он может содержать только объекты String.
Следовательно, компилятор знает, что только метод String может быть возвращен из метода get (). Поэтому вам не нужно приводить элемент, возвращенный get (), в String.
Перебор списка с использованием API Java Stream
Четвертый способ итерации через API Java Stream. Для итерации вы должны сначала получить поток из списка. Получение потока из списка в Java выполняется путем вызова метода Liststream ().
Как только вы получили поток из списка, вы можете выполнить итерацию потока, вызвав его метод forEach ().
Вызов метода forEach () заставит Stream выполнить внутреннюю итерацию всех элементов потока.
Средняя оценка / 5. Количество голосов:
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Источник
Как распечатать все элементы списка на Java?
Я пытаюсь распечатать все элементы List , однако он печатает указатель Object вместо значения.
Это мой реферальный код.
может ли кто-нибудь помочь мне, почему он не печатает значение элементов.
18 ответов
вот пример получения распечатки компонента списка:
следующее компактно и избегает цикла в вашем примере кода (и дает вам хорошие запятые):
однако, как указывали другие, если у вас нет разумных методов toString (), реализованных для объектов внутри списка, вы получите указатели на объекты (хэш-коды, на самом деле), которые вы наблюдаете. Это верно независимо от того, есть они в списке или нет.
начиная с Java 8, List наследует метод «forEach» по умолчанию, который вы можете объединить с системой «справочник по методу».out:: println » like this:
toString() of AbstractCollection будет чистым и достаточно легко сделать это. AbstractList является наследником AbstractCollection , поэтому нет необходимости в цикле и не требуется toArray ().
возвращает строковое представление этой коллекции. Строковое представление состоит из списка элементов коллекции в порядок их возврата итератором, заключенным в квадратные скобки («[]»). Примыкающий элементы разделяются символами «, » (запятая и космос). Элементы преобразуются в строки как Строка.метод valueOf(объекта).
если вы используете любой пользовательский объект в своем списке, скажем Student, вам нужно переопределить его toString() метод (всегда хорошо переопределить этот метод), чтобы иметь значимый вывод
подход потоков Java 8.
объекты в списке должны быть toString реализовано для них, чтобы напечатать что-то значимое для экрана.
вот быстрый тест, чтобы увидеть различия:
и когда это выполняется, результат печатается на экране:
поскольку T1 не переопределяет метод toString, его экземпляр T1 печатается как что-то не очень полезное. С другой стороны, T2 переопределяет toString, поэтому мы контролируем, что он печатает, когда он используется в I / O, и мы видим на экране кое-что получше.
С помощью функций java 8.
рассмотрим List stringList который можно напечатать многими способами, используя Java 8 конструкции:
как эти подходы отличаются друг от друга?
Первый Подход ( Iterable.forEach ) — Итератор коллекции обычно используется, и он предназначен для fail-fast что означает, что он будет бросать ConcurrentModificationException если базовая коллекция составляет структурно модифицированных в ходе итерации. Как уже упоминалось в doc на ArrayList :
структурная модификация — это любая операция, которая добавляет или удаляет больше элементов или явно изменяет размер резервного массива; просто установка значение элемента не является структурной модификацией.
значит ArrayList.forEach установка значения разрешается без каких-либо проблем. И в случае параллельной коллекции, например ConcurrentLinkedQueue итератор будет слабо согласуется что означает действия, переданные в forEach допускаются даже структурные изменения без ConcurrentModificationException исключения. Но здесь изменения могут быть или не быть видны в этой итерации.
Второй Подход ( Stream.forEach )- Порядок не определен. Хотя это может не произойти для последовательных потоков, но спецификация не гарантирует этого. Также требуется, чтобы действие носило невмешательский характер. Как упоминалось в doc:
поведение этой операции явно недетерминированные. Для параллельные трубопроводы потока, эта деятельность не гарантируют к уважайте порядок встречи потока, так как это принесло бы жертву благо параллелизм.
Третий Подход ( Stream.forEachOrdered )- Действие будет выполняться в порядке встречи потока. Поэтому всякий раз, когда порядок имеет значение, используйте forEachOrdered не задумываясь. Как упоминалось в doc:
выполнить действие для каждого элемента этого потока, в встреча порядок потока если поток имеет определенный порядок встречи.
при итерации над синхронизировать коллекцию the первый подход взял бы блокировку коллекции один раз и удерживал бы ее во всех вызовах метода action, но в случае потоков они используют spliterator коллекции, который не блокирует и опирается на уже установленные правила невмешательства. В случае, если резервное копирование коллекции потока изменяется во время итерации a ConcurrentModificationException будет брошен или может произойти несогласованный результат.
Четвертый Подход (Параллельный Stream.forEach )- Как уже упоминалось, нет гарантии соблюдения порядка встречи, как ожидалось, в случае параллельных потоков. Возможно, что действие выполняется в разных потоках для разных элементов, которые никогда не могут быть дело с forEachOrdered .
Пятый Подход (Параллельный Stream.forEachOrdered )- The forEachOrdered будет обрабатывать элементы в порядке, указанном источнике независимо от того, является ли поток последовательной или параллельной. Поэтому нет смысла использовать это с параллельными потоками.
- вы не указали, какие элементы содержит список, если это примитивный тип данных затем вы можете распечатать элементы.
но если элементы являются объектами, то, как упоминал Kshitij Mehta, вам нужно реализовать (переопределить) метод «toString» внутри этого объекта — если он еще не реализован — и пусть он возвращает что-то полное значение из объекта, например:
Источник