Ответ
Доступ к элементам в коллекциях, реализующих интерфейс java.util.List, осуществляется несколькими способами:
1. Прямой доступ по индексу
Используется метод get(int index). Это основной способ для списков с эффективным произвольным доступом (например, ArrayList).
List<String> list = Arrays.asList("A", "B", "C");
String element = list.get(1); // Возвращает "B"
Важно: Для ArrayList сложность O(1), для LinkedList — O(n).
2. Использование итератора (Iterator) Стандартный способ для безопасного последовательного обхода и удаления элементов.
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (someCondition) {
iterator.remove(); // Безопасное удаление во время итерации
}
}
3. Использование ListIterator
Расширяет Iterator, позволяя обход в обоих направлениях, модификацию и получение индекса.
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String next = listIterator.next();
// listIterator.previous(); // Перемещение назад
// listIterator.set("newValue"); // Замена текущего элемента
}
4. Улучшенный цикл for (for-each)
Удобный синтаксический сахар для итерации, который компилируется в использование Iterator.
for (String item : list) {
System.out.println(item);
}
5. Использование Stream API (Java 8+) Для функциональных операций: фильтрации, преобразования, агрегации.
list.stream()
.filter(s -> s.startsWith("A"))
.forEach(System.out::println);
Выбор способа зависит от задачи:
- Получение конкретного элемента →
get(index). - Последовательный обход или удаление →
Iteratorилиfor-each. - Двунаправленный обход или замена →
ListIterator. - Функциональная обработка →
Stream API.
Ответ 18+ 🔞
Ну, вот смотри, как у нас с этими списками в Java дела обстоят, блядь. Как будто в шкафу с инструментами — дохуя способов достать нужную хрень, но если схватишь не тот, можешь себе по пальцам прилететь, ёпта.
1. Тупой лобовой доступ, по индексу
Вот это прям как в ларёк за хлебом — знаешь полку, знаешь номер, иди и бери. Метод get(int index). Для ArrayList — это огонь, моментально, O(1). А вот если в LinkedList так делать, то это пиздец, O(n), он будет с начала ползти, как увалень, пока не доползёт.
List<String> list = Arrays.asList("A", "B", "C");
String element = list.get(1); // Вытащит "B", просто и ясно
2. Классический итератор (Iterator)
Это как взять проводника в джунглях, чтобы не сожрали. Идёшь по порядку, и если надо — можешь безопасно пристрелить мешающий элемент методом remove(). Без него если начнёшь удалять в обычном цикле — получишь ConcurrentModificationException прямо в ебало.
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Мусор")) {
iterator.remove(); // Выкинул нахуй, и коллекция не взбесилась
}
}
3. Навороченный ListIterator А это уже итератор с прибамбасами, как швейцарский нож. Может и вперёд, и назад, и заменить элемент на лету. Хули ещё надо?
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String next = listIterator.next();
// listIterator.previous(); // Откатиться, если перебрал
// listIterator.set("НовоеЗначение"); // Переписать нахуй текущее
}
4. Цикл for-each (улучшенный for) Красота, ёба! Никакого геморроя с индексами и итераторами. Компилятор сам всё развернёт в итератор, а ты просто наслаждаешься жизнью. Но, внимание, ебать — удалять внутри него нихуя нельзя!
for (String item : list) {
System.out.println(item); // Прошёлся, посмотрел, красота
}
5. Stream API (Java 8 и дальше) Вот это уже высший пилотаж, блядь. Не просто достать, а сразу по цепочке: отфильтровал, преобразовал, собрал. Как на конвейере. Для сложной обработки — самое оно, хотя для простого перебора — оверкилл, конечно.
list.stream()
.filter(s -> s.startsWith("A")) // Отсеял всё, что не на "A"
.forEach(System.out::println); // Выплюнул результат
Короче, выбор способа — это как выбор оружия, чувак:
- Нужен конкретный элемент по номеру —
get(index), но помни проLinkedList, а то охуеешь ждать. - Просто пройтись по всем или выкинуть что-то по дороге —
Iteratorилиfor-each(но удалять только через итератор!). - Нужно шастать туда-сюда и менять на ходу —
ListIterator, ёпта. - Хочешь функционально наколдовать —
Stream API, там тебе и фильтры, и мапы, и прочая магия.
Вот и вся философия, блядь. Главное — не пытайся удалять из for-each, а то будет тебе волнение ебать и ConcurrentModificationException в сраку.