Автор оригинала: Pankaj Kumar.
Java ArrayList-один из наиболее широко используемых классов коллекций. java.util.ArrayList
класс реализует java.util.Список
интерфейс. Java ArrayList также реализует интерфейсы RandomAccess, клонируемые и сериализуемые. Класс Java ArrayList расширяет класс AbstractList, который является базовой реализацией интерфейса списка.
Java ArrayList
Java ArrayList-это реализация интерфейса списка с возможностью изменения размера массива, это означает, что он начинается с размера по умолчанию и автоматически увеличивается при добавлении большего количества данных в список массивов. Некоторые важные моменты, касающиеся Java ArrayList, заключаются в следующем:
- Java ArrayList почти аналогичен Vector, за исключением того, что он несинхронизирован, поэтому производительность выше в однопоточной среде.
- Java ArrayList не является потокобезопасным, поэтому при использовании в многопоточной среде необходимо проявлять особую осторожность.
- Java ArrayList может содержать повторяющиеся значения, он также допускает значение “null”.
- Объекты в java ArrayList добавляются по порядку. Таким образом, вы всегда можете получить первый объект по индексу 0.
- Емкость Java ArrayList по умолчанию определена как 10. Однако мы можем изменить емкость по умолчанию с помощью конструктора или путем вызова
ensureCapacity(int minCapacity)
метода. - Реализация итератора и листератора Java ArrayList является быстрой . Если структура списка будет изменена после создания итератора любым другим способом, кроме добавления или удаления методов итератора, это вызовет исключение ConcurrentModificationException .
- Java ArrayList обеспечивает произвольный доступ к своим элементам, потому что он работает с индексом. Мы можем извлечь любой элемент через его индекс.
- Java ArrayList поддерживает универсальные файлы, и это рекомендуемый способ создания списка массивов.
Конструкторы Java ArrayList
В классе Java ArrayList есть три конструктора.
- public ArrayList() : Наиболее широко используемый конструктор Java ArrayList. Этот конструктор ArrayList вернет пустой список с начальной емкостью 10.
- public ArrayList(int initialCapacity) : Этот конструктор ArrayList вернет пустой список с начальной емкостью, указанной в аргументе initialCapacity. Этот конструктор полезен, когда вы знаете, что ваш список будет содержать огромные данные, и вы хотите сэкономить время перераспределения, предоставив большое значение начальной емкости. Если начальный аргумент емкости отрицательный, он выдаст
Исключение незаконных аргументов
. - публичный список массивов(Коллекция (E> c) : Этот конструктор ArrayList вернет список, содержащий элементы указанной коллекции, в том порядке, в котором они возвращаются итератором коллекции. Это вызовет известное
Исключение NullPointerException
, если указанный аргумент коллекции равен null. (E> c)
Ниже приведен простой фрагмент кода, показывающий используемые конструкторы Java ArrayList.
// Java ArrayList default constructor Listvowels = new ArrayList (); //Java ArrayList constructor with initial capacity List dictionaryWordsList = new ArrayList (50000); vowels.add("A"); vowels.add("B"); vowels.add("C"); vowels.add("D"); vowels.add("E"); //Creating my list from different collection source List myList = new ArrayList (vowels);
Методы Java ArrayList
Java ArrayList содержит множество методов, которые мы регулярно используем.
- общедоступное логическое добавление(E e) : Добавляет указанный элемент в конец этого списка.
- public void add(индекс int, элемент E) : Вставляет указанный элемент в указанную позицию в списке. Сдвигает элемент, находящийся в данный момент в этом положении (если таковой имеется), и любые последующие элементы вправо. Если индекс больше размера списка или отрицательный, он вызовет исключение IndexOutOfBoundsException.
- общедоступный логический addAll(Коллекция расширяет E> c) : Добавляет все элементы указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции. Эта операция вызывает исключение NullPointerException, если указанная коллекция равна null. расширяет E> c)
- : Добавляет все элементы указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции. Эта операция вызывает исключение NullPointerException, если указанная коллекция равна null. общедоступный логический addAll(индекс int, коллекция (E> c)
- : Вставляет все элементы указанной коллекции в этот список, начиная с указанной позиции. Сдвигает элемент, находящийся в данный момент в этом положении (если таковой имеется), и любые последующие элементы вправо (увеличивает их индексы). Этот метод вызовет исключение IndexOutOfBoundsException, если значение индекса больше размера списка или отрицательное. Этот метод также вызывает исключение NullPointerException, если указанная коллекция равна null. (E> c) : Вставляет все элементы указанной коллекции в этот список, начиная с указанной позиции. Сдвигает элемент, находящийся в данный момент в этом положении (если таковой имеется), и любые последующие элементы вправо (увеличивает их индексы). Этот метод вызовет исключение IndexOutOfBoundsException, если значение индекса больше размера списка или отрицательное. Этот метод также вызывает исключение NullPointerException, если указанная коллекция равна null.
- общедоступное логическое значение содержит(объект o) : Возвращает значение true, если этот список содержит указанный элемент.
- public void clear() : Удаляет все элементы из этого списка.
- public void ensureCapacity(int minCapacity) : При необходимости увеличивает емкость этого экземпляра ArrayList, чтобы гарантировать, что он может содержать по крайней мере количество элементов, указанное аргументом минимальной емкости.
- публичная пустота для каждого(Потребитель супер E> действие) : Выполняет заданное действие для каждого элемента Итерации до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение. супер E> действие)
- : Выполняет заданное действие для каждого элемента Итерации до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение. public E get(индекс int)
- : Возвращает элемент в указанной позиции в этом списке. public boolean isEmpty()
- : Возвращает значение true, если этот список не содержит элементов. public int indexOf(объект o)
- : Возвращает индекс первого вхождения указанного элемента в этом списке или -1, если этот список не содержит элемента. общедоступный итератор итератор()
- : Возвращает итератор по элементам в этом списке в правильной последовательности. Возвращаемый итератор работает быстро. public int lastIndexOf(объект o)
- : Возвращает индекс последнего вхождения указанного элемента в этом списке или -1, если этот список не содержит элемента. public ListIterator ListIterator()
- : Возвращает список элементов в этом списке (в правильной последовательности). Итератор возвращаемого списка работает быстро. public ListIterator ListIterator(индекс int)
- : Возвращает список элементов в этом списке (в правильной последовательности), начиная с указанной позиции в списке. Указанный индекс указывает первый элемент, который будет возвращен при первоначальном вызове next. Первоначальный вызов previous вернет элемент с указанным индексом минус единица. Этот метод вызывает исключение IndexOutOfBoundsException, если значение индекса больше размера списка или отрицательное. public E удалить(индекс int)
- : Удаляет элемент в указанной позиции в этом списке. Сдвигает все последующие элементы влево (вычитает один из их индексов). общедоступное логическое удаление(Объект o)
- : Удаляет первое вхождение указанного элемента из этого списка, если оно присутствует. Если список не содержит элемента, он остается неизменным. public boolean removeAll(Коллекция c)
- : Удаляет из этого списка все его элементы, содержащиеся в указанной коллекции. общедоступное логическое значение retainAll(Коллекция c)
- : Сохраняет только элементы в этом списке, содержащиеся в указанной коллекции. Другими словами, удаляет из этого списка все его элементы, которые не содержатся в указанной коллекции. общедоступное логическое значение removeIf(Предикат super E> фильтр)
- : Удаляет все элементы этой коллекции, удовлетворяющие данному предикату. super E> фильтр) : Удаляет все элементы этой коллекции, удовлетворяющие данному предикату.
- public void replaceAll(оператор UnaryOperator) : Заменяет каждый элемент этого списка результатом применения оператора к этому элементу.
- public int size() : Возвращает количество элементов в этом списке.
- общедоступный набор E(индекс int, элемент E) : Заменяет элемент в указанной позиции в этом списке указанным элементом.
- открытый список Подсписка(int fromIndex, int toIndex) : Возвращает представление части этого списка между указанным fromIndex, включительно, и toIndex, эксклюзивно. Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке, и наоборот.
- общедоступный разделитель разделитель() : Создает разделитель с поздней привязкой и быстрым завершением работы над элементами в этом списке.
- публичная сортировка пустоты(Компаратор super E> c) : Сортирует этот список в соответствии с порядком, заданным указанным компаратором. super E> c)
- : Сортирует этот список в соответствии с порядком, заданным указанным компаратором. public void trimToSize()
Пример Java ArrayList
Давайте рассмотрим пример методов ArrayList с помощью некоторых программ.
Общие операции Java ArrayList
Ниже приведен простой пример программы для Arraylist, показывающий часто используемые методы.
package com.journaldev.examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Java ArrayList Example Program * * @author pankaj * */ public class ArrayListExample { public static void main(String args[]) { Listletters = new ArrayList (); //add example letters.add("A"); letters.add("C"); letters.add("D"); //let's insert B between A and C letters.add(1,"B"); System.out.println(letters); List list = new ArrayList (); list.add("E");list.add("H"); //appending list elements to letters letters.addAll(list); System.out.println(letters); //clear example to empty the list list.clear(); list.add("F");list.add("G"); //inserting list inside letters to get right sequence letters.addAll(5, list); System.out.println(letters); //contains example System.out.println("Letters list contains E ? "+letters.contains("E")); System.out.println("Letters list contains Z ? "+letters.contains("Z")); //ensureCapacity example, it's ArrayList method, so object should be defined like below. ArrayList tempList = new ArrayList<>(); tempList.ensureCapacity(1000); //get example String e = letters.get(4); System.out.println("Letter at 5th place: "+e); //tempList is empty? System.out.println("tempList is empty ? "+tempList.isEmpty()); //indexOf example System.out.println("First index of D = "+letters.indexOf("D")); System.out.println("Last index of D = "+letters.lastIndexOf("D")); //remove examples System.out.println(letters); String removed = letters.remove(3); System.out.println("After removing '"+removed+"' letters contains "+letters); //remove first occurrence of H boolean isRemoved = letters.remove("H"); System.out.println("H removed? "+isRemoved+". Letters contains "+letters); System.out.println("list contains "+list); //remove all matching elements between letters and list letters.removeAll(list); System.out.println(letters); //retainAll example list.clear();list.add("A");list.add("B");list.add("C"); letters.retainAll(list); System.out.println("letters elements after retainAll operation: "+letters); //size example System.out.println("letters ArrayList size = "+letters.size()); //set example letters.set(2, "D"); System.out.println(letters); //toArray example String[] strArray = new String[letters.size()]; strArray = letters.toArray(strArray); System.out.println(Arrays.toString(strArray)); } }
Результаты вышеприведенной программы приведены ниже.
[A, B, C, D] [A, B, C, D, E, H] [A, B, C, D, E, F, G, H] Letters list contains E ? true Letters list contains Z ? false Letter at 5th place: E tempList is empty ? true First index of D = 3 Last index of D = 3 [A, B, C, D, E, F, G, H] After removing 'D' letters contains [A, B, C, E, F, G, H] H removed? true. Letters contains [A, B, C, E, F, G] list contains [F, G] [A, B, C, E] letters elements after retainAll operation: [A, B, C] letters ArrayList size = 3 [A, B, D] [A, B, D]
Java ArrayList для каждого
Метод Java ArrayList forEach был добавлен в Java 8. Это полезно, когда вы хотите выполнить одно и то же действие со всеми элементами. Аргумент метода Потребитель
является функциональным интерфейсом, поэтому мы также можем использовать лямбда-выражения. Ниже приведен пример для каждого метода, показывающий способ старой школы, а также способ лямбда-выражения.
package com.journaldev.examples; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class ArrayListForEachExample { public static void main(String[] args) { Liststocks = new ArrayList<>(); stocks.add("Google"); stocks.add("Apple"); stocks.add("Microsoft"); stocks.add("Facebook"); Consumer
Выходные данные, полученные программой ArrayList для каждого примера, являются:
Processing Google Processing Apple Processing Microsoft Processing Facebook Processed Google Processed Apple Processed Microsoft Processed Facebook
Итератор Java ArrayList
Итератор-это интерфейс в рамках коллекций Java. ArrayList обеспечивает быструю реализацию итератора. Если вы хотите выполнить какую-либо операцию со всеми элементами списка, вам следует использовать итератор. Если во время итерации в список будет внесено какое-либо структурное изменение, операция next() вызовет исключение ConcurrentModificationException. Ниже приведен простой пример итератора ArrayList.
package com.journaldev.examples; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListIteratorExample { public static void main(String[] args) { Listints = new ArrayList<>(); for(int i=0; i<10; i++) ints.add(i); Iterator it = ints.iterator(); //simple iteration while(it.hasNext()){ int x = (int) it.next(); System.out.print(x + ", "); } System.out.println("\n"+ints); //modification of list through iterator it = ints.iterator(); while(it.hasNext()){ int x = (int) it.next(); if(x%2 ==0) it.remove(); } System.out.println(ints); //changing list structure while iterating it = ints.iterator(); while(it.hasNext()){ int x = (int) it.next(); //ConcurrentModificationException here if(x==5) ints.add(20); } } }
Вывод, полученный приведенным выше примером итератора ArrayList, является:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9] Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at com.journaldev.examples.ArrayListIteratorExample.main(ArrayListIteratorExample.java:34)
Узнайте больше об исключении ConcurrentModificationException и о том, как его избежать .
Список списков Java ArrayList
Мы можем использовать ListIterator для перемещения по списку в обоих направлениях. Это позволяет нам удалять, а также добавлять элемент в список. Вы также можете получить текущую позицию итератора в списке. Давайте рассмотрим простой пример перечислителя списков ArrayList для обхода списка в обратном направлении и изменения данных списка.
package com.journaldev.examples; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ArrayListListIteratorExample { public static void main(String[] args) { Listints = new ArrayList<>(); for (int i = 0; i < 10; i++) ints.add(i); ListIterator lit = ints.listIterator(ints.size()); while(lit.hasPrevious()){ int x = lit.previous(); System.out.print(x + ", "); if(x==5){ lit.remove(); lit.add(20); } } System.out.println("\n"+ints); } }
Обратите внимание на результат, полученный вышеуказанной программой.
9, 8, 7, 6, 5, 20, 4, 3, 2, 1, 0, [0, 1, 2, 3, 4, 20, 6, 7, 8, 9]
Java ArrayList удалить, если
Метод ArrayList removeIf был добавлен в Java 8. Этот метод удалит все элементы в списке, которые удовлетворяют данному предикату. Давайте рассмотрим простую программу Java ArrayList remove, если пример.
package com.journaldev.examples; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; public class ArrayListRemoveIfExample { public static void main(String[] args) { Listints = new ArrayList<>(); for (int i = 0; i < 10; i++) ints.add(i); Predicate filter = new ArrayListRemoveIfExample(). new MyPredicate(); ints.removeIf(filter); System.out.println(ints); //lambda expression, remove elements divisible by 3 ints.removeIf(x -> {return x %3 == 0;}); System.out.println(ints); } class MyPredicate implements Predicate { @Override public boolean test(Integer t) { return t %2 == 0; } } }
Ниже приведен результат вышеприведенной программы.
[1, 3, 5, 7, 9] [1, 5, 7]
Java ArrayList заменяет все
Метод ArrayList replaceAll был добавлен в Java 8. Это полезно, когда вы хотите применить какую-либо функцию ко всем элементам списка. Давайте взглянем на пример программы ArrayList replaceAll.
package com.journaldev.examples; import java.util.ArrayList; import java.util.List; import java.util.function.UnaryOperator; public class ArrayListReplaceAllExample { public static void main(String[] args) { Listints = new ArrayList<>(); for (int i = 0; i < 10; i++) ints.add(i); //multiply all elements by 10 UnaryOperator operator = new ArrayListReplaceAllExample(). new MyUnaryOperator(); ints.replaceAll(operator); System.out.println(ints); //lambda expression example, multiply by 5 ints.replaceAll(x -> {return x*5;}); System.out.println(ints); } class MyUnaryOperator implements UnaryOperator { @Override public Integer apply(Integer t) { return t*10; } } }
Ниже приведен вывод приведенного выше примера программы replaceAll.
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90] [0, 50, 100, 150, 200, 250, 300, 350, 400, 450]
Подсписка Java ArrayList
Когда мы используем метод подсписка со списком, он возвращает представление части исходного списка. Этот новый список подкреплен исходным списком, поэтому любые изменения будут отражены и в другом списке. Семантика списка, возвращаемого этим методом, становится неопределенной, если вспомогательный список структурно изменен каким-либо иным способом, кроме как с помощью возвращенного списка. Все методы в новом списке сначала проверяют, соответствует ли фактическое значение параметра modCount в резервном списке ожидаемому значению, и создают исключение ConcurrentModificationException, если это не так. Давайте рассмотрим это поведение на примере простого подсписка ArrayList.
package com.journaldev.examples; import java.util.ArrayList; import java.util.List; public class ArrayListSubListExample { public static void main(String[] args) { Listnames = new ArrayList<>(); names.add("Pankaj"); names.add("David");names.add("Lisa");names.add("Meghna"); List first2Names = names.subList(0, 2); System.out.println(names +" , "+first2Names); names.set(1, "Kumar"); //check the output below. :) System.out.println(names +" , "+first2Names); first2Names.add("Megan"); //this is fine System.out.println(names +" , "+first2Names); //this is fine //Let's modify the list size and get ConcurrentModificationException names.add("Deepak"); System.out.println(names +" , "+first2Names); //this line throws exception } }
Ниже приведен вывод приведенного выше примера программы с подсписками ArrayList.
[Pankaj, David, Lisa, Meghna] , [Pankaj, David] [Pankaj, Kumar, Lisa, Meghna] , [Pankaj, Kumar] [Pankaj, Kumar, Megan, Lisa, Meghna] , [Pankaj, Kumar, Megan] Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231) at java.util.ArrayList$SubList.listIterator(ArrayList.java:1091) at java.util.AbstractList.listIterator(AbstractList.java:299) at java.util.ArrayList$SubList.iterator(ArrayList.java:1087) at java.util.AbstractCollection.toString(AbstractCollection.java:454) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at com.journaldev.examples.ArrayListSubListExample.main(ArrayListSubListExample.java:26)
Сортировка по списку массивов Java
Мы можем использовать метод сортировки ArrayList для сортировки его элементов. Ниже приведен простой пример, показывающий сортировку по списку массивов.
package com.journaldev.examples; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Random; public class ArrayListSortingExample { public static void main(String[] args) { Listints = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) ints.add(random.nextInt(1000)); System.out.println("Original List: "+ints); //sort the list MyComparator c = new ArrayListSortingExample(). new MyComparator(); ints.sort(c); System.out.println("Sorted in Increasing Order: "+ints); //lambda example, sort in reverse order ints.sort((o1,o2) -> {return (o2-o1);}); System.out.println("Sorted in Decreasing Order: "+ints); } class MyComparator implements Comparator { @Override public int compare(Integer o1, Integer o2) { return (o1 - o2); } } }
Вывод вышеуказанной программы сортировки является:
Original List: [580, 855, 889, 858, 536, 842, 223, 405, 854, 354] Sorted in Increasing Order: [223, 354, 405, 536, 580, 842, 854, 855, 858, 889] Sorted in Decreasing Order: [889, 858, 855, 854, 842, 580, 536, 405, 354, 223]
Потокобезопасный список массивов
Java ArrayList не является потокобезопасным. Поэтому, если вы работаете в многопоточной среде, используйте приведенный ниже код для получения потокобезопасного списка массивов.
ListsynchronizedList = Collections.synchronizedList(ints);
В этом случае вы также можете использовать класс параллельной коллекции CopyOnWriteArrayList.
Это все для примера учебника Java ArrayList, я надеюсь, что здесь не было пропущено ничего важного. 🙂