본문 바로가기
DEV/Java

[자바]ArrayList

by 어쩌다개발 2023. 2. 6.
반응형

ArrayList 는 프로젝트하면서 정말 많이 사용한다.

저장순서가 유지되고 중복을 허용한다는 특징을 갖고 있다.

Vector와 비슷한데, Vector는 기존에 작성된 소스와의 호환성을 위해 남겨 둔 거라서 Vector보다는 ArrayList를 사용하는 것이 좋다.

ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다.

만약, 배열에 더 이상 저장 할 공간이 없다면 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장된다.

public class ArrayList extends AbstractList {
	implements List, RandomAccess, Cloneable, java.io.Serializable {
     ...
     transient Object[] elementData; //오브젝트배열
     ...
    }
}
메서드 설명
ArrayList() 크기가 10인 ArrayList 생성
ArrayList(Collection c) 주어진 컬렉션이 저장된 ArrayList를 생성
ArrayList(int initialCapacity) 지정된 초기용량을 갖는 ArrayList를 생성
boolean add(Object o) ArrayList의 마지막에 객체를 추가. 성공하면 true
void add(int index, Object element) 지정된 index에 객체를 저장
boolean addAll(Collection c) 주어진 컬렉션의 모든 객체를 저장
boolean addAll(int index, Collection c) 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장
void clear() ArrayList를 완전비 비움
Object clone() ArrayList를 복제
boolean contains(Object o) 지정된 객체(o)가 ArrayList에 포함되어 있는지 확인
void ensureCapacity(int minCapacity) ArrayList의 용량이 최소한 minCapacity가 되도록 함.
Object get(int index) 지정된 위치(index)에 저장된 객체를 반환
int indexOf(Object o) 지정된 객체가 저장된 위치를 찾아 반환
boolean isEmpty() ArrayList가 비어있는지 확인
Iterator iterator() ArrayList의 Iterator 객체를 반환
int lastIndexOf(Object o) 객체(o)가 저장된 위치를 끝부터 역방향으로 검색해서 반환
ListIterator listIterator() ArrayList의 ListIterator를 반환
ListIterator listIterator(int index) ArrayList으 ㅣ지정된 위치부터 시작하는 ListIterator를 반환
Ojbect remove(int index) 지정된 index에 있는 객체를 제거
boolean remove(Object o) 지정된 객체를 제거(성공시 true, 실패시 false)
boolean removeAll(Conllection c) 지정한 컬렉션에 저장된 것과 동일한 객체들을 ArrayList에서 제거
boolean retainAll(Collection c) ArrayList에 저장된 객체 중에서 주어진 컬렉션과 공통된 것들만을 남기고 나머지는 삭제
Object set(int index, Object element) 주어진 element를 지정된 index에 저장
int size() ArrayList에 저장된 객체의 개수를 반환
void sort(Comparator c) 지정된 정렬기준(c)으로 ArrayList를 정렬
List subList(int fromIndex, int toIndex) fromIndex부터 toIndex 사이에 저장된 객체를 반환
Object[] to Array() ArrayList에 저장된 모든 객체들을 객체비열로 반환
Object[] toArray(Ojbect[] a) ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환
void trimToSize() 용량을 크기에 맞게 줄임.(빈 공간 없앰.)
import java.util.ArrayList;
import java.util.Collections;

public class ArrayListEx1 {
    public static void main(String[] args) {
        ArrayList list1 = new ArrayList(10);
        list1.add(5);
        list1.add(4);
        list1.add(2);
        list1.add(1);
        list1.add(3);
        list1.add(0);

        //list1의 index 1 ~ 4(4미포함) 사이에 저장된 객체를 반환
        ArrayList list2 = new ArrayList(list1.subList(1, 4));
        print(list1, list2);
        
        //결과
        //list1: [5, 4, 2, 1, 3, 0]
        //list2: [4, 2, 1]

        //정렬
        Collections.sort(list1);
        Collections.sort(list2);
        print(list1, list2);
        
        //결과
        //list1: [0, 1, 2, 3, 4, 5]
        //list2: [1, 2, 4]

        //list1이 list2의 모든 요소를 포함하고 있을 때 true
        System.out.println("list1.containsAll(list2) : " + list1.containsAll(list2));
        //결과
        //list1.containsAll(list2) : true

        //list1에 A,C 추가
        list1.add("A");
        list1.add("C");
        print(list1, list2);
        //결과
        //list1: [0, 1, 2, 3, 4, 5, A, C]
        //list2: [1, 2, 4]

        //list1 index 3에 B 추가
        list1.add(3, "B");
        //list2 index 3에 A 추가
        list2.add(3, "A");

        //list2 3을 "AA"로 수정
        list2.set(3, "AA");

        print(list1, list2);
        //결과
        //list1: [0, 1, 2, B, 3, 4, 5, A, C]
        //list2: [1, 2, 4, AA]

        //list1에서 list2와 겹치는 부분만 남기고 나머지 삭제
        System.out.println("list1.retainAll(list2) : " + list1.retainAll(list2));
        //결과
        //ist1.retainAll(list2) : true(변화가 있었음을 의미)
        
        print(list1, list2);
        //결과
        //list1: [1, 2, 4]
        //list2: [1, 2, 4, AA]

        //list2에서 list1에 포함된 객체들을 삭제
        for (int i = list2.size() - 1; i >= 0; i--) {
            if (list1.contains(list2.get(i))) {
                list2.remove(i);
            }
        }
        print(list1, list2);
        //결과
        //list1: [1, 2, 4]
        //list2: [AA]
    }

    static void print(ArrayList list1, ArrayList list2) {
        System.out.println("list1: " + list1);
        System.out.println("list2: " + list2);
        System.out.println("");
    }
}

* ArrayList를 생성할 때, 저장할 요소의 개수를 고려해서 실제 저장할 개수보다 약간 여유있는 크기로 하는 것이 좋다.
생성할 때 지정한 크기보다 더 많은 객체를 저장하면 자동적으로 크기가 늘어나기는 하지만 이 과정에서 처리시간이 많이 소요된다.

 

참고] 자바의 정석

반응형

'DEV > Java' 카테고리의 다른 글

[자바] Stack(스택)과 Queue(큐)  (3) 2023.02.12
[자바] LinkedList  (3) 2023.02.11
[자바] 컬렉션 프레임워크(Collections Framework)  (4) 2023.02.05
[자바] java.time 패키지  (5) 2023.02.03
[자바] MessageFormat  (3) 2023.02.02

댓글