Рубрики
Без рубрики

Java ArrayList

Пример учебника по Java ArrayList. java.util.Методы ArrayList – добавить, добавить, удалить, сортировать, для каждого, Итератор, список, удалить, подсписок, заменить все

Автор оригинала: 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 есть три конструктора.

  1. public ArrayList() : Наиболее широко используемый конструктор Java ArrayList. Этот конструктор ArrayList вернет пустой список с начальной емкостью 10.
  2. public ArrayList(int initialCapacity) : Этот конструктор ArrayList вернет пустой список с начальной емкостью, указанной в аргументе initialCapacity. Этот конструктор полезен, когда вы знаете, что ваш список будет содержать огромные данные, и вы хотите сэкономить время перераспределения, предоставив большое значение начальной емкости. Если начальный аргумент емкости отрицательный, он выдаст Исключение незаконных аргументов .
  3. публичный список массивов(Коллекция (E> c) : Этот конструктор ArrayList вернет список, содержащий элементы указанной коллекции, в том порядке, в котором они возвращаются итератором коллекции. Это вызовет известное Исключение NullPointerException , если указанный аргумент коллекции равен null. (E> c)

Ниже приведен простой фрагмент кода, показывающий используемые конструкторы Java ArrayList.

// Java ArrayList default constructor
List vowels = 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 содержит множество методов, которые мы регулярно используем.

  1. общедоступное логическое добавление(E e) : Добавляет указанный элемент в конец этого списка.
  2. public void add(индекс int, элемент E) : Вставляет указанный элемент в указанную позицию в списке. Сдвигает элемент, находящийся в данный момент в этом положении (если таковой имеется), и любые последующие элементы вправо. Если индекс больше размера списка или отрицательный, он вызовет исключение IndexOutOfBoundsException.
  3. общедоступный логический addAll(Коллекция расширяет E> c) : Добавляет все элементы указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции. Эта операция вызывает исключение NullPointerException, если указанная коллекция равна null. расширяет E> c)
  4. : Добавляет все элементы указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции. Эта операция вызывает исключение NullPointerException, если указанная коллекция равна null. общедоступный логический addAll(индекс int, коллекция (E> c)
  5. : Вставляет все элементы указанной коллекции в этот список, начиная с указанной позиции. Сдвигает элемент, находящийся в данный момент в этом положении (если таковой имеется), и любые последующие элементы вправо (увеличивает их индексы). Этот метод вызовет исключение IndexOutOfBoundsException, если значение индекса больше размера списка или отрицательное. Этот метод также вызывает исключение NullPointerException, если указанная коллекция равна null. (E> c) : Вставляет все элементы указанной коллекции в этот список, начиная с указанной позиции. Сдвигает элемент, находящийся в данный момент в этом положении (если таковой имеется), и любые последующие элементы вправо (увеличивает их индексы). Этот метод вызовет исключение IndexOutOfBoundsException, если значение индекса больше размера списка или отрицательное. Этот метод также вызывает исключение NullPointerException, если указанная коллекция равна null.
  6. общедоступное логическое значение содержит(объект o) : Возвращает значение true, если этот список содержит указанный элемент.
  7. public void clear() : Удаляет все элементы из этого списка.
  8. public void ensureCapacity(int minCapacity) : При необходимости увеличивает емкость этого экземпляра ArrayList, чтобы гарантировать, что он может содержать по крайней мере количество элементов, указанное аргументом минимальной емкости.
  9. публичная пустота для каждого(Потребитель супер E> действие) : Выполняет заданное действие для каждого элемента Итерации до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение. супер E> действие)
  10. : Выполняет заданное действие для каждого элемента Итерации до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение. public E get(индекс int)
  11. : Возвращает элемент в указанной позиции в этом списке. public boolean isEmpty()
  12. : Возвращает значение true, если этот список не содержит элементов. public int indexOf(объект o)
  13. : Возвращает индекс первого вхождения указанного элемента в этом списке или -1, если этот список не содержит элемента. общедоступный итератор итератор()
  14. : Возвращает итератор по элементам в этом списке в правильной последовательности. Возвращаемый итератор работает быстро. public int lastIndexOf(объект o)
  15. : Возвращает индекс последнего вхождения указанного элемента в этом списке или -1, если этот список не содержит элемента. public ListIterator ListIterator()
  16. : Возвращает список элементов в этом списке (в правильной последовательности). Итератор возвращаемого списка работает быстро. public ListIterator ListIterator(индекс int)
  17. : Возвращает список элементов в этом списке (в правильной последовательности), начиная с указанной позиции в списке. Указанный индекс указывает первый элемент, который будет возвращен при первоначальном вызове next. Первоначальный вызов previous вернет элемент с указанным индексом минус единица. Этот метод вызывает исключение IndexOutOfBoundsException, если значение индекса больше размера списка или отрицательное. public E удалить(индекс int)
  18. : Удаляет элемент в указанной позиции в этом списке. Сдвигает все последующие элементы влево (вычитает один из их индексов). общедоступное логическое удаление(Объект o)
  19. : Удаляет первое вхождение указанного элемента из этого списка, если оно присутствует. Если список не содержит элемента, он остается неизменным. public boolean removeAll(Коллекция c)
  20. : Удаляет из этого списка все его элементы, содержащиеся в указанной коллекции. общедоступное логическое значение retainAll(Коллекция c)
  21. : Сохраняет только элементы в этом списке, содержащиеся в указанной коллекции. Другими словами, удаляет из этого списка все его элементы, которые не содержатся в указанной коллекции. общедоступное логическое значение removeIf(Предикат super E> фильтр)
  22. : Удаляет все элементы этой коллекции, удовлетворяющие данному предикату. super E> фильтр) : Удаляет все элементы этой коллекции, удовлетворяющие данному предикату.
  23. public void replaceAll(оператор UnaryOperator) : Заменяет каждый элемент этого списка результатом применения оператора к этому элементу.
  24. public int size() : Возвращает количество элементов в этом списке.
  25. общедоступный набор E(индекс int, элемент E) : Заменяет элемент в указанной позиции в этом списке указанным элементом.
  26. открытый список Подсписка(int fromIndex, int toIndex) : Возвращает представление части этого списка между указанным fromIndex, включительно, и toIndex, эксклюзивно. Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке, и наоборот.
  27. общедоступный разделитель разделитель() : Создает разделитель с поздней привязкой и быстрым завершением работы над элементами в этом списке.
  28. публичная сортировка пустоты(Компаратор super E> c) : Сортирует этот список в соответствии с порядком, заданным указанным компаратором. super E> c)
  29. : Сортирует этот список в соответствии с порядком, заданным указанным компаратором. 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[]) {
		List letters = 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) {
		
		List stocks = new ArrayList<>();
		stocks.add("Google"); stocks.add("Apple");
		stocks.add("Microsoft"); stocks.add("Facebook");
		
		Consumer consumer = new ArrayListForEachExample().new MyConsumer();
		
		stocks.forEach(consumer);
		
		//lambda style
		stocks.forEach(x -> {System.out.println("Processed "+x);});
		
	}

	class MyConsumer implements Consumer{

		@Override
		public void accept(Object t) {
			System.out.println("Processing "+t);
		}
		
	}
}

Выходные данные, полученные программой 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) {

		List ints = 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) {

		List ints = 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) {
		List ints = 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) {
		List ints = 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) {
		
		List names = 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) {
		List ints = 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 не является потокобезопасным. Поэтому, если вы работаете в многопоточной среде, используйте приведенный ниже код для получения потокобезопасного списка массивов.

List synchronizedList = Collections.synchronizedList(ints);

В этом случае вы также можете использовать класс параллельной коллекции CopyOnWriteArrayList.

Это все для примера учебника Java ArrayList, я надеюсь, что здесь не было пропущено ничего важного. 🙂