1. Общ преглед
В тази статия ще разгледаме класа ArrayList от Java Collections Framework. Ще обсъдим неговите свойства, обичайните случаи на употреба, както и неговите предимства и недостатъци.
ArrayList се намира в Java Core Libraries, така че не се нуждаете от допълнителни библиотеки. За да го използвате, просто добавете следния оператор за импортиране:
import java.util.ArrayList;
Списъкът представлява подредена последователност от стойности, при които дадена стойност може да се появи повече от веднъж.
ArrayList е една от реализациите на List, изградена върху масив, която може динамично да расте и да се свива, докато добавяте / премахвате елементи. Елементите могат лесно да бъдат достъпни чрез техните индекси, започвайки от нула. Това изпълнение има следните свойства:
- Случайният достъп отнема O (1) време
- Добавянето на елемент отнема амортизирано постоянно време O (1)
- Вмъкването / изтриването отнема O (n) време
- Търсенето отнема O (n) време за несортиран масив и O (log n) за сортиран
2. Създайте ArrayList
ArrayList има няколко конструктора и ще ги представим всички в този раздел.
Първо, забележете, че ArrayList е общ клас, така че можете да го параметризирате с какъвто и да е тип и компилаторът ще гарантира, че например няма да можете да поставите Integer стойности в колекция от низове . Освен това не е нужно да хвърляте елементи, когато ги извличате от колекция.
На второ място, добра практика е да се използва общ списък с интерфейси като променлив тип, тъй като той го отделя от конкретна реализация.
2.1. Конструктор No-Arg по подразбиране
List list = new ArrayList(); assertTrue(list.isEmpty());
Ние просто създаваме празен екземпляр ArrayList .
2.2. Конструктор приема първоначален капацитет
List list = new ArrayList(20);
Тук указвате първоначалната дължина на подлежащ масив. Това може да ви помогне да избегнете ненужно преоразмеряване, докато добавяте нови елементи.
2.3. Конструктор Приемаща колекция
Collection number = IntStream.range(0, 10).boxed().collect(toSet()); List list = new ArrayList(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list));
Забележете, че този елемент от екземпляра на Collection се използва за попълване на базовия масив.
3. Добавете елементи към ArrayList
Можете да вмъкнете елемент или в края, или в конкретната позиция:
List list = new ArrayList(); list.add(1L); list.add(2L); list.add(1, 3L); assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));
Можете също така да вмъкнете колекция или няколко елемента наведнъж:
List list = new ArrayList(Arrays.asList(1L, 2L, 3L)); LongStream.range(4, 10).boxed() .collect(collectingAndThen(toCollection(ArrayList::new), ys -> list.addAll(0, ys))); assertThat(Arrays.asList(4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo(list));
4. Итерация над ArrayList
Налични са два типа итератори: Iterator и ListIterator .
Докато първият ви дава възможност да прекосите списъка в една посока, вторият ви позволява да го прекосите и в двете посоки.
Тук ще ви покажем само ListIterator :
List list = new ArrayList( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); ListIterator it = list.listIterator(list.size()); List result = new ArrayList(list.size()); while (it.hasPrevious()) { result.add(it.previous()); } Collections.reverse(list); assertThat(result, equalTo(list));
Можете също така да търсите, добавяте или премахвате елементи с помощта на итератори.
5. Търсете в ArrayList
Ще демонстрираме как работи търсенето с помощта на колекция:
List list = LongStream.range(0, 16) .boxed() .map(Long::toHexString) .collect(toCollection(ArrayList::new)); List stringsToSearch = new ArrayList(list); stringsToSearch.addAll(list);
5.1. Търсене в несортиран списък
За да намерите елемент, можете да използвате методите indexOf () или lastIndexOf () . И двамата приемат обект и връщат стойност int :
assertEquals(10, stringsToSearch.indexOf("a")); assertEquals(26, stringsToSearch.lastIndexOf("a"));
Ако искате да намерите всички елементи, отговарящи на предикат, можете да филтрирате колекцията с помощта на Java 8 Stream API (прочетете повече за това тук), използвайки Predicate по следния начин:
Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = stringsToSearch .stream() .filter(matchingStrings::contains) .collect(toCollection(ArrayList::new)); assertEquals(6, result.size());
Също така е възможно да използвате цикъл for или итератор:
Iterator it = stringsToSearch.iterator(); Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = new ArrayList(); while (it.hasNext()) { String s = it.next(); if (matchingStrings.contains(s)) { result.add(s); } }
5.2. Търсене в сортиран списък
Ако имате сортиран масив, тогава можете да използвате двоичен алгоритъм за търсене, който работи по-бързо от линейното търсене:
List copy = new ArrayList(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1)));
Забележете, че ако елемент не бъде намерен, тогава -1 ще бъде върната.
6. Remove Elements from the ArrayList
In order to remove an element, you should find its index and only then perform the removal via remove() method. An overloaded version of this method, that accepts an object, searches for it and performs removal of the first occurrence of an equal element:
List list = new ArrayList( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); Collections.reverse(list); list.remove(0); assertThat(list.get(0), equalTo(8)); list.remove(Integer.valueOf(0)); assertFalse(list.contains(0));
But be careful when working with boxed types such as Integer. In order to remove a particular element, you should first box int value or otherwise, an element will be removed by its index.
You may as well use the aforementioned Stream API for removing several items, but we won't show it here. For this purpose we will use an iterator:
Set matchingStrings = HashSet(Arrays.asList("a", "b", "c", "d", "e", "f")); Iterator it = stringsToSearch.iterator(); while (it.hasNext()) { if (matchingStrings.contains(it.next())) { it.remove(); } }
7. Summary
In this quick article, we had a look at the ArrayList in Java.
Показахме как да създадем екземпляр на ArrayList , как да добавяме, намираме или премахваме елементи, използвайки различни подходи.
Както обикновено, можете да намерите всички примерни кодове в GitHub.