
Для простого перебора элементов подходят циклы for и for-each, которые обеспечивают прямой доступ к каждому элементу по индексу или последовательно по коллекции. В случаях, когда требуется модификация элементов во время прохода, используют Iterator и ListIterator, что предотвращает ConcurrentModificationException.
Цикл for обеспечивает прямой доступ к элементам ArrayList по индексу. Этот способ удобен, когда необходимо знать позицию элемента или изменять значения во время перебора. Индексы в ArrayList начинаются с нуля и заканчиваются size() — 1.
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

Использование метода get(i) позволяет получать каждый элемент по индексу без создания дополнительного объекта. Такой подход подходит для массивов небольшого и среднего размера, однако для больших коллекций предпочтительнее использовать Iterator, чтобы избежать затрат на частые обращения к элементам LinkedList.
Применение цикла for-each для перебора элементов

Цикл for-each предоставляет удобный способ перебора всех элементов списка без необходимости работы с индексами. Он подходит для ArrayList, LinkedList и других реализаций Collection, когда важен сам элемент, а позиция не нужна.
Пример использования:
for (String item : list) {
System.out.println(item);
}
Такой цикл уменьшает вероятность ошибок, связанных с неверным индексом, и делает код компактным. Для наглядности различий между стандартным циклом for и for-each можно использовать следующую таблицу:
| Метод | Синтаксис | Когда использовать |
|---|---|---|
| for | for (int i = 0; i < list.size(); i++) | Нужен доступ по индексу, модификация элементов |
| for-each | for (Тип item : list) | Перебор всех элементов без изменения индекса |
Метод forEach позволяет перебрать все элементы списка с использованием лямбда-выражений, что упрощает код и повышает читаемость. Он доступен для всех коллекций, реализующих интерфейс Iterable, включая ArrayList и LinkedList.

Метод Arrays.toString() позволяет быстро получить строковое представление массива и вывести все его элементы одним вызовом. Он работает с массивами примитивных типов и объектными массивами.
Пример применения:
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(numbers));
Результат будет в виде строки: [1, 2, 3, 4, 5]. Такой подход удобен для отладки, логирования и быстрого визуального контроля содержимого массива без необходимости использовать циклы.
int[][] matrix = {{1,2},{3,4}};
System.out.println(Arrays.deepToString(matrix));
list.stream()
