Dico

[Java] Class ArrayList

Collection Framework

데이터 군을 저장하는 클래스들을 표준화한 설계

컬렉션 Collection :  다수의 데이터. 데이터 그룹

프레임웍 Framework :  표준화된 프로그래밍 방식.

Class ArrayList

  • List 인터페이스를 구현한 클래스

      저장된 순서를 유지한다.

  • 기존의 Vector를 개선한 클래스

      Vector와는 구현원리와 기능적인 측면에서 동일하다.

  • 읽고 저장하는 것에 효율적이다.

      Object 배열을 이용하여 데이터를 순차적으로 저장한다.

  • 용량 변경에 비효율적이다.

      처음 인스턴스 생성 시, 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성한다.

      자동적으로 크기가 늘어나긴 하지만 그 과정에서 처리시간이 많이 소요된다.

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    ...
    transient Object[] elementData;
    ...
}

elementDate라는 이름의 Object 배열을 멤버변수로 선언. 모든 종류의 객체를 담을 수 있다.

Public constructors

생성자설명
  ArrayList(int initialCapacity)  지정된 초기 용량을 갖는 ArrayList 생성
  ArrayList()  크기가 10인 ArrayList 생성
  ArrayList(Collection<? extends E> c)  주어진 컬렉션이 저장된 ArrayList 생성

Public methods

반환 타입이름설명
  boolean  add(E e)  ArrayList의 마지막에 객체를 추가.
  성공하면 true
  void  add(int index, E element)  지정된 위치에 객체 추가
  boolean  addAll(Collection<? extends E> c)  주어진 컬렉션의 모든 객체 추가
  boolean  addAll(int index, Collection<? extends E> c)  지정된 위치부터 주어진 컬렉션의 모든 객체 추가
  void  clear()  ArrayList를 완전히 비운다
  Object  clone()  ArrayList 복제
  boolean  contains(Object o)  지정된 객체가 ArrayList에 포함되어 있는 지 확인
  void  ensureCapacity(int minCapacity)  ArrayList의 용량이 최소한 minCapacity가 되도록 한다
  E  get(int index)  지정된 위치에 저장된 객체를 반환
  int  indexOf(Object o)  지정된 객체가 저장된 위치를 찾아 반환
  boolean  isEmpty()  ArrayList가 비어있는 지 확인 
  Iterator  iterator()  ArrayList의 Iterator 객체를 반환
  int  lastIndexOf(Object o)  객체가 저장된 위치를 끝부터 역방향으로 검색해서 반환
  ListIterator  listIterator(int index)  ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환
  ListIterator  listIterator()  ArrayList의 ListIterator를 반환
  E  remove(int index)  지정된 위치에 있는 객체를 제거
  boolean  remove(Object o)  지정한 객체를 제거. 성공하면 true
  boolean  removeAll(Collection<?> c)  지정한 컬렉션에 저장된 것과 동일한 객체들을 제거
  boolean  removeIf(Predicate<? super E> filter)  지정된 조건과 일치하는 컬렉션의 모든 객체 제거
  E  set(int index, E element)  지정된 위치에 객체 저장
  int
  size()  ArrayList에 저장된 객체의 개수를 반환
  void  sort(Comparator<? super E> c)  지정된 정렬 기준으로 ArrayList 정렬
  List  subList(int fromIndex, int toIndex)  fromIndex부터 toIndex 사이에 저장된 객체를 반환
  Object[]  toArray()  ArrayList에 저장된 모든 객체들을 객체 배열로 반환
  T[]  toArray(T[] a)   ArrayList에 저장된 모든 객체들을 객체 배열 a에 담아 반환
  void  trimToSize()  용량을 크기에 맞게 줄인다. 빈 공간 제거

Example01 - 기본적인 메서드로 객체 다루기

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

public class Test {
    public static void main(String[] args){
        
        ArrayList<String> list1 = new ArrayList<>();
        for (int i = 0; i < 5; ++i) {
            list1.add(String.valueOf((int) (Math.random() * 10)));
        }

        ArrayList<String> list2 = new ArrayList<>(list1.subList(1, 4));
        System.out.println("list1 : " + list1 + ", list2 : " + list2);
                         // list1 : [6, 8, 0, 2, 6], list2 : [8, 0, 2]

        Collections.sort(list1);
        Collections.sort(list2);
        System.out.println("list1 : " + list1 + ", list2 : " + list2);
                         // list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8]

        System.out.println(list1.containsAll(list2));                      // true

        list2.add("B");
        list2.add("C");
        list2.add(3, "add");
        System.out.println("list1 : " + list1 + ", list2 : " + list2);
                         // list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8, add, B, C]

        list2.set(3, "set");
        System.out.println("list1 : " + list1 + ", list2 : " + list2);
                         // list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8, set, B, C]

        System.out.println(list1.retainAll(list2));                        // true
        System.out.println("list1 : " + list1 + ", list2 : " + list2);
                         // list1 : [0, 2, 8], list2 : [0, 2, 8, set, B, C]

    }
}

add(int index, E element) :  객체 추가. 지정된 위치에서부터 기존 데이터들이 뒤로 밀려난다.

set(int index, E element) :  객체 저장. 지정된 위치에 기존 데이터가 있으면 새로운 데이터로 바꿔 저장한다.

Collections 클래스의 sort(List<T> list) :  List에 저장된 객체들을 정렬한다.

Example02 - 공통요소 찾아서 삭제하기

!! 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리 이동을 한다.

for (int i = list2.size() - 1; i >= 0; i--) {
    if (list1.contains(list2.get(i))) {
        list2.remove(i);
    }
}
// 전 - list1 : [0, 2, 8], list2 : [0, 2, 8, set, B, C]
// 후 - list1 : [2, 7, 8], list2 : [set, B, C]

만일 제어변수를 증가시켜가면서 삭제하면, 

한 요소가 삭제될 때마다 자리 변동이 일어나 올바른 결과를 얻을 수 없다.

제어변수를 감소시켜가면서 삭제해야 자리 이동이 발생해도 영향을 받지 않고 작업이 가능하다.

Example03 - 문자열 데이터를 원하는 길이로 잘라서 ArrayList에 담기

ArrayList의 크기는 실제 저장할 개수보다 약간 여유 있게 하는 것이 좋다.

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

public class Test {
    public static void main(String[] args){
        final int LIMIT = 10;
        String source = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int length = source.length();
        
        List<String> list = new ArrayList<>(length / LIMIT + 10);
        
        for (int i = 0; i < length; i += LIMIT) {
            if (i + LIMIT < length) {
                list.add(source.substring(i, i + LIMIT));
            } else {
                list.add(source.substring(i));
            }
        }

        for (String s : list) {
            System.out.println(s);
        }
    }
}
abcdefghij
klmnopqrst
uvwxyz0123
456789ABCD
EFGHIJKLMN
OPQRSTUVWX
YZ

ArrayList API

참고 서적: 자바의 정석 3판 2