자료구조

[Java] ArrayList

Joo.v7 2024. 9. 2. 21:41

ArrayList

    • 연속적인 데이터의 리스트 (데이터는 연속적으로 들어 있어야 하고, 중간에 빈 공간이 있어서는 안됨)
    • 내부적으로 Object[] 배열을 이용하여 요소를 저장
      • index를 사용하여 요소에 빠르게 접근
      • 일반적인 배열과는 달리, 가변적으로 공간을 늘이거나 줄인다.
    • 데이터가 중간에 삽입할 경우, 빈 공간이 생기지 않도록 요소들의 위치를 재정렬 해야함.
    • read가 빠르지만, insert/delete가 느리다. (삽입, 삭제가 적고, 작은 데이터를 다룰 때 사용)

Java Collections Framework의 ArrayList 클래스 계층 구조

 

코드

(1) List.java : List라면 갖춰야 할 ADT(객체에 대한 설계도)를 Interface로 구현. (Java에서 Interface를 ADT로 사용함)

(2) ArrayList.java : 배열을 이용한 ArrayList 구현.

 

(1) List.java

/* Arraylist의 ADT */

import java.util.Iterator;

public interface List<E> extends Iterable<E>  {
    void add(E item);
    E get(int index);
    void remove(int index);
    int size();
    boolean isEmpty();
    void clear();
}

 

(2) ArrayList.java

/* ArrayList.java */
import java.util.Iterator;
import java.util.Arrays;

@SuppressWarnings("unchecked")
public class ArrayList<E> implements List<E>, Iterable<E> {
    private E[] elements;
    private int index = 0;

    public ArrayList() {
        this.elements = (E[]) new Object[10];
    }
    
    public void add(E item) {
        this.elements[this.index++] = item;
    }

    public E get(int index) {
        return this.elements[index];
    }

    public void remove(int index) {
        for (int i = index; i < this.index - 1; i++) {
            this.elements[i] = this.elements[i+1];
            this.elements[i+1] = null;
        }
        this.index--;
    }

    public int size() {
        return this.index;
    }

    public boolean isEmpty() {
        return this.index == 0 ? true : false;
    }

    public void clear() {
        for (int i = 0; i < this.elements.length; i++) {
            this.elements[i] = null;
        }
        this.index = 0;
        // Arrays.fill(this.elements, null); 
        // 위 for문과 같은 결과 도출. fill()은 위의 for문처럼 똑같이 동작하는 메소드.
    }

    public Iterator<E> iterator() {
        return Arrays.stream(this.elements).iterator(); // java의 배열을 iterator로 만듬.
    }
}

class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("!!!");

        list.forEach(System.out::println);
    }
}

 

실행 결과

Hello
World
!!!
null
null
null
null
null
null
null

// forEach문으로 요소 끝까지 탐색해서 null도 print됨.

 

 


 

 

2024.09.02 - [자료구조] - [자료구조] 스택(Stack) with Java

 

[자료구조] 스택(Stack) with Java

Stack(스택) 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 및 Last in First Out(LIFO) 구조의 자료구조. Java에서 자료구조(알고리즘)를 만들 때, 해당 객체에 대한 설계도(ADT, Abstract Data Type)를 Interface

lightningtech.tistory.com

 

 

출처: https://github.com/gikpreet/class-programming_with_java/tree/master

 

GitHub - gikpreet/class-programming_with_java

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com