Сегодня мы поработаем с ArrayList в Java: посмотрим на примерах самые популярные и полезные методы.
Данный урок является прямым продолжением статьи Коллекции в java, в которой мы разобрали основы и структуру классов коллекций. Теперь, попробуем немного попрактиковаться на примерах.
ArrayList – коллекция на основе массива. Это означает, что она имеет все преимущества и недостатки массивов java.
Это также означает, что работа с элементами данной коллекции подразумевает под собой работу с элементами массива. То есть – “под капотом” данного класса находится массив в чистом виде. Фактически, разработчики предоставляют нам удобные и простые методы для работы с массивом. Соответственно, использовать ArrayList нужно тогда, когда необходима скорость чтения из коллекции, но менее важна скорость удаления данных.
Какие основные методы предоставляет нам ArrayList:
- add(element) – добавляет элемент в коллекцию;
- get(index) – достает элемент по индексу;
- clear() – полностью очищает коллекцию;
- addAll(another_collection) – добавляет один список в другой;
- remove(index) – удяляет объект по индексу;
- remove(object) удаляет по объекту;
- removeAll(collection_with_remove_elements) – если нужно удалить целый список объектов;
- size() – возвращает длину коллекции;
- isEmpty() – проверяет на пустоту;
- forEach() – обход всех элементов.
Выше я перечислил только самые используемые методы класса ArrayList. Теперь, посмотрим пример их использования:
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("Monica");
stringArrayList.add("Chandler");
stringArrayList.add("Ross");
stringArrayList.add("Rachel");
stringArrayList.add("Joe");
stringArrayList.add("Phoebe");
ArrayList<String> clonnedArrayList = (ArrayList<String>) stringArrayList.clone();
String element = stringArrayList.get(2);
System.out.println(element); //Ross
System.out.println(stringArrayList.size()); //6
stringArrayList.clear();
System.out.println(stringArrayList.size()); //0
ArrayList<String> stringArrayList1 = new ArrayList<>();
stringArrayList1.add("Monica");
stringArrayList1.add("Chandler");
stringArrayList1.add("Ross");
stringArrayList.addAll(stringArrayList1);
System.out.println(stringArrayList.size()); //3
stringArrayList.remove(0);
stringArrayList.remove("Ross");
System.out.println(stringArrayList.size()); //1
stringArrayList.removeAll(stringArrayList1);
System.out.println(stringArrayList.isEmpty()); //true
System.out.println(clonnedArrayList.isEmpty()); //false
System.out.println(clonnedArrayList.contains("Monica")); //true
System.out.println(clonnedArrayList.indexOf("Chandler")); //1
System.out.println(clonnedArrayList.indexOf("Terminator")); //-1
List<String> sublist = clonnedArrayList.subList(3, 6);
System.out.println(sublist.size()); //3
System.out.println(clonnedArrayList.size()); //6
}
}
Как видно на примере выше – работать с ArrayList очень просто и удобно. Названия методов говорят сами за себя.
Начнем с самого начала инициализации ArrayList. Все списки принимают только объекты одного типа. Поэтому, перед инициализацией необходимо указать: с каким типом данных мы будем работать. В примере выше я выбрал тип данных String поэтому должен был явно указать его при создании коллекции массива. Далее, при работе с колекцией, я должен добавлять только строки и работать со строками. Иначе, будет ошибка компиляции. Одной из причин появления классов оберток для примитивных типов является то, что коллекции не работают с примитивами – только с объектами. Поэтому, такой тип записи работать не будет:
ArrayList<int> intList = new ArrayList<>();
Если Вы планируете создавать списки целочисленных или дробних значений – нужно воспользоваться классами обертками примитивных типов:
ArrayList<Integer> intList = new ArrayList<>();
Отдельно я хочу показать как обходить ArrayList и выводить его значения.
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("Monica");
stringArrayList.add("Chandler");
stringArrayList.add("Ross");
stringArrayList.add("Rachel");
stringArrayList.add("Joe");
stringArrayList.add("Phoebe");
stringArrayList.stream().forEach(it-> System.out.println(it)); //используя стримы
stringArrayList.forEach(it-> System.out.println(it));//используя стримы вызывая напрямую метод forEach
stringArrayList.forEach(System.out::println); //используя стримы и method reference
for (String s:stringArrayList) {//используя форич (foreach)
System.out.println(s);
}
for(int i=0; i<stringArrayList.size(); i++){//по старинке, используя индекс
System.out.println(stringArrayList.get(i));
}
}
}
Поскольку работа с элементами ArrayList и особенно вывод их в консоль – очень распространенная операция, я решил показать несколько примеров вывода. Конечно же, я предпочитаю тот, который самый простой и требует найменьше затрат по написанию:
stringArrayList.forEach(System.out::println);
Это все, что я хотел показать по теме работы с ArrayList. Когда Вы начнете использовать данный вид коллекции – примеры выше помогут разобраться на начальных этапах. Дальше, их использование будет интуитивным и понятным.