1년뒤의나는다르겠지

[JAVA] 배열 ArrayList 본문

자료구조 알고리즘

[JAVA] 배열 ArrayList

Lirodek 2024. 10. 22. 16:36

ArrayList의 특징

  1. 동적 크기 : 크기가 가변적으로 변하는 배열입니다.
  2. 순차적 데이터 저장 : 일반 배열과 유사하게 인덱스로 내부 객체를 관리합니다.
  3. 타입 안정성 : 제네릭을 사용하여 특정 타입의 객체만 저장할 수 있습니다.
  4. 중복 허용 : 동일한 요소를 여러번 저장할 수 있습니다.
  5. 순서보장 : 요소들의 순서가 유지됩니다.

주요 매서드

  • [[#add]] 요소추가
  • [[#get]] 특정 인덱스 요소 반환
  • [[#remove]] 특정 인덱스 요소 제거
  • [[#size]] 크기 반환
  • [[#clear]] 모든 요소 제거
  • [[#contains]] 특정 요소를 포함하는지 확인
  • [[#indexOf]] 특정 요소의 인덱스 반환

장점

  1. 동적 크기 조정 : 요소가 추가됨에 따라 크기가 자동으로 확정되어 유연한 데이터 저장이 가능합니다.
  2. 빠른 요소 접근 : 인덱스를 사용해 O(1)시간 복잡도로 요소에 빠르게 접근할 수 있습니다.
  3. 간편한 사용
  4. 순서 유지 : 요소가 삽입된 순서를 유지함
  5. 연속된 메모리 : 메모리가 연속적으로 저장되어 캐시 효율성이 좋습니다.

단점

  1. 삽입 / 삭제 시 성능 저하 : 크기가 가득 차면 배열을 새로 생성하고 복사해야 하므로 성능 저하가 일어날 수 있습니다.
  2. 메모리 사용 : 동적 배열 할당으로 인해 메모리 사용이 필요.
  3. 쓰레드 안정성 부족 : 멀티 쓰레드 환경에서 사용할 경우 스레드의 안정성이 보장되지 않습니다.
  4. 중간 요소 삽입/삭제 비효율 : 리스트 중간에 요소를 삽입, 삭제할 때 해당 위치 이후 모든 요소를 이동시켜야 하므로 비효율적입니다.

데이터의 삽입 삭제가 빈번히 일어날 경우 [[연결리스트]] 더 효율적입니다.

구현부

add

// 끝자리 추가
public void add(T element) {  
    array[size++] = element;  
    resize();  
}
// 특정 위치에 추가
public void add(int index, T element) {  
    if (index < 0 || index > size ) {  
        throw new IndexOutOfBoundsException();  
    }  
    for (int i = size-1; i >= index; i--) {  
        array[i+1] = array[i];  
    }  
    array[index] = element;  
    resize();  
}

get

public T get(int index) {  
    return array[index];  
}

size

public int size() {  
    return size;  
}

remove

public T remove(int index) {  
    if (index < 0 || index > size - 1) {  
        throw new IndexOutOfBoundsException();  
    }  

    T element = array[index];  
    for (int i = index; i < size - 1; i++) {  
        array[i] = array[i+1];  
    }  
    return element;  
}

clear

public void clear(){  
    size = 0;  
    array = (T[]) new Object[defaultSize];  
}

contains

public boolean contains(T element) {  
    for (int i = 0; i < size; i++) {  
        if (array[i].equals(element)) {  
            return true;  
        }  
    }  
    return false;  
}

indexOf

public int indexOf(T element) {  
    for (int i = 0; i < size; i++) {  
        if (array[i].equals(element)) {  
            return i;  
        }  
    }  
    return -1;  
}