프로그래밍/JAVA

java Collection - List 정리

p-a-r-k 2020. 3. 10. 19:24
반응형

List

List는 데이터를 순차적으로 일렬로 구성한다.

인덱스가 부여되므로 인덱스로 검색이 가능하고, Set과는 다르게 중복이 허용된다.

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

  • ArrayList

  • AttributeList

  • CopyOnWriteArrayList

  • LinkedList

  • RoleList

  • RoleUnresolvedList

  • Vector

  • Stack

ArrayList

기본적으로 생성하게 되면 10개의 저장 공간을 갖는다.

제네릭을 이용하여 타입을 명시해 줄 수 있다.

ArrayList list1 = new ArrayList();
list1.add("park");

System.out.print(list1.get(0));

순차적 추가, 인덱스를 이용한 추가, 제거를 할 수 있다.

public static void main(String[] ar) {
    ArrayList numbers = new ArrayList<>();

    numbers.add(10);
    numbers.add(20);
    numbers.add(30);
    numbers.add(40);
    System.out.println("add(값)");
    System.out.println(numbers);

    numbers.add(1, 50);
    System.out.println("\nadd(인덱스, 값)");
    System.out.println(numbers);

    numbers.remove(2);
    System.out.println("\nremove(인덱스)");
    System.out.println(numbers);

    System.out.println("\nget(인덱스)");
    System.out.println(numbers.get(2));

    System.out.println("\nsize()");
    System.out.println(numbers.size());

    System.out.println("\nindexOf()");
    System.out.println(numbers.indexOf(30));
}

반복

ArrayList 탐색을 위한 방법으로 Iterator를 제공한다.

foreach, for도 사용가능하다.

Iterator it = numbers.iterator();
System.out.println("\niterator");
while (it.hasNext()) {
    int value = (int) it.next();
    if (value == 30) {
        it.remove();
    }
    System.out.println(value);
}
System.out.println(numbers);

System.out.println("\nfor each");
for (int value : numbers) {
    System.out.println(value);
}
System.out.println("\nfor");
for (int i = 0; i < numbers.size(); i++) {
    System.out.println(numbers.get(i));
}

LinkedList

Array List와는 다르게 엘리먼트와 엘리먼트 간의 연결(link)을 이용해서 리스트를 구현한 것을 의미한다.

ArrayList와는 달리 List 인터페이스를 구현한 AbstractList를 상속하지 않고 AbstractSequentialList를 상속

ArrayList는 일반적으로 LinkedList보다 검색이 빠르고 순차적 추가, 제거도 좋은 성능을 가진다.

하지만 배열의 중간에 추가 될 때 LinkedList는 Array의 크기를 조정하거나 인덱스 업데이트가 필요없어서,

링크된 목록에서의 추가, 제거 작업은 LinkedList가 더 빠르다.

단, 앞 뒤 두개의 참조를 저장하므로 ArrayList보다 더 많은 메모리영역을 차지한다.

public static void main(String[] ar) {
    LinkedList numbers = new LinkedList();

    numbers.addLast(1);
    numbers.addLast(2);
    numbers.addLast(3);
    System.out.println(numbers); // [1, 2, 3]

    System.out.println(numbers.remove(1)); // 2
    System.out.println(numbers); // [1, 3]

    System.out.println(numbers.removeFirst()); // 1
    System.out.println(numbers); // [3]

    numbers.add(7);
    System.out.println(numbers); // [3, 7]
    System.out.println(numbers.size()); // 2

    System.out.println(numbers.get(1)); // 7
}

Vector

Collection 인터페이스를 기반으로 구현한 List 클래스에서 파생한 클래스이며, 크기가 동적인 배열을 사용할 때 주로 사용한다.

동기화(Thread Safe) 되어있으며 한번에 하나의 스레드만 벡터의 메소드를 호출 할 수 있다.

* Vector가 동기화 된다면 ArrayList는 동기화가 되지않은 상태이다.

* Vector는 한번에 하나의 스레드만 엑세스(접근) 가능하며, ArrayList는 동시에 여러 스레드가 작업할 수 있다.

동기화가 되어있기때문에 동기화가 안된 ArrayList보다 더 느리다.

크기 증가

Vector는 현재 배열의 크기의 100%가 증가하며, ArrayList의 경우 현재 배열의 크기의 50%가 증가한다.

멀티스레드 환경이 아닌 경우 ArrayList를 사용하는것이 바람직하다..

Stack

List 컬렉션 클래스의 Vector 클래스를 상속받아, 전형적인 스택 메모리 구조의 클래스를 제공한다.

가장 나중에 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조.

제공되는 5가지 메서드

  • push (추가)

  • pop (마지막 데이터 삭제)

  • peek (마지막 데이터 조회)

  • empty (비었는지 확인)

  • search (위치반환)

public static void main(String[] ar){
    Stack stack = new Stack();
    stack.push(3); // 3
    stack.push(2); // 3, 2
    System.out.println(stack.pop()); // 2
    stack.push(6); // 3, 6
    stack.push(8); // 3, 6, 8
    System.out.println(stack.peek()); // 8
    System.out.println(stack.search(6)); // 2
    while(stack.empty()==false){
        System.out.println(stack.pop()); // 8, 6, 3 순으로 꺼냄
    }
    System.out.println(stack); // []
}
반응형