betacode

Руководство Java ArrayList

  1. ArrayList
  2. Как ArrayList хранит элементы?
  3. Examples

1. ArrayList

ArrayList - это класс, который реализует interface List и поддерживает все функции List, включая опциональные. В основном, ArrayList управляет массивом для хранения его элементов, этот массив может быть заменен другим массивом большей длины, если количество элементов ArrayList увеличивается.
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Ниже приведены характеристики ArrayList:
  • ArrayList позволяет содержать повторяющиеся и элементы null.
  • ArrayList поддерживает порядок вставки элементов.
  • ArrayList не синхронизирован, поэтому его необходимо синхронизировать для использования в Multithreading (многопоточной среде).
  • ArrayList обеспечивает произвольный доступ к элементам на основе индекса.
  • Работа в ArrayList немного медленнее, чем в LinkedList (подробнее см. принцип работы ArrayList).
ArrayList очень похож на Vector, за исключением того, что он асинхронен. В спреде Multithreading он должен быть обернут (wrapped) с помощью метода Collections.synchronizedList.
ArrayList<String> arrayList = new ArrayList<String>();
        
List<String> syncList = Collections.synchronizedList(arrayList);
CopyOnWriteArrayList - это потокобезопасный (thread-safe) вариант ArrayList, который вы можете использовать:
ArrayList constructors:
ArrayList()
Создать пустой объект ArrayList с внутренним массивом с начальной емкостью 10 элементов.
ArrayList(Collection<? extends E> c)
Создать объект ArrayList, содержащий все элементы указанной Collection, порядок элементов определяется Iterator of Collection.
ArrayList(int initialCapacity)
Создать пустой объект ArrayList с внутренним массивом указанной начальной емкости.

2. Как ArrayList хранит элементы?

ArrayList управляет массивом объектов. Все действия по добавлению, вставке или удалению элемента из списка ArrayList приведут к присвоению (или обновлению) значений другим элементам массива, что может повлиять на многие элементы массива.
arrayList.add(X)
Когда вы добавляете элемент в ArrayList, он будет назначен элементу массива в индексе arrayList.size().
arrayList.add(idx,X)
Когда вы вставляете элемент в ArrayList, многие элементы в массиве должны будут обновить свои значения.
arrayList.remove(idx)
Удаление элемента с индексом idx из ArrayList также приводит к тому, что многие элементы массива обновляются новыми значениями
ArrayList будетзаменять массив, которым он управляет, новым массивом большей длины, если количество добавленных элементов больше длины текущего массива.

3. Examples

Например, использование ArrayList в среде Multithreading:
ArrayList_sync.java
package org.o7planning.arraylist.ex;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayList_sync {

    public static void main(String[] args) throws InterruptedException {
        new ArrayList_sync();
    }
    
    public ArrayList_sync() throws InterruptedException {
         ArrayList<String> arrayList = new ArrayList<String>();
         
         List<String> syncList = Collections.synchronizedList(arrayList);
          
         ThreadA threadA = new ThreadA(syncList);
         ThreadB threadB = new ThreadB(syncList);
         
         threadA.start();
         threadB.start();
         
         threadA.join();
         threadB.join();
         
         for(String s: syncList)  {
             System.out.println(s);
         }
    }
    
   class ThreadA extends Thread {
        private List<String> list;
        public ThreadA(List<String> list) {
            this.list = list;
        }
        @Override
        public void run() {
            for(int i= 0; i< 1000; i++) {
                this.list.add("A "+ i);
            }
        }
    }
    
    class ThreadB extends Thread {
        private List<String> list;
        public ThreadB(List<String> list) {
            this.list = list;
        }
        @Override
        public void run() {
            for(int i= 0; i< 1000; i++) {
                this.list.add("B "+ i);
            }
        }
    }
}
Output:
...
A 938
B 898
A 939
B 899
A 940
B 900
A 941
B 901
A 942
...
ArrayList поддерживает все функции, указанные в interface List, включая дополнительные функции. Вы можете найти лучшие примеры о ArrayList в статье ниже: