컬렉션 프레임웍

우수민·2021년 11월 2일
0

1. 컬렉션 프레임웍(Collections Framework)

  • 컬렉션 프레임웍이란, '데이터 군을 저장하는 클래스들을 표준화한 설계'를 뜻한다. 컬렉션은 다수의 데이터, 즉 데이터 그룹을, 프레임윅은 표준화된 프로그래밍 방식을 의미한다.
  • 컬렉션 프레임웍은 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공한다. 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다.

1.1 컬렉션 프레임웍의 핵심 인터페이스

  • 컬렉션 프레임웍의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 클래스의 이름에 포함되어 있어서 이름만으로도 클래스의 특징을 쉽게 알 수 있도록 되어있다.
  • 그러나 Vector, Stack, Hashtable, Properties와 같은 클래스들은 컬렉션 프레임웍이 만들어지기 이전부터 존재하던 것이기 때문에 컬렉션 프레임웍의 명명법을 따르지 않는다.

Collection인터페이스

  • Collection인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의하고 있다.

List인터페이스

  • List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다.

Set인터페이스

  • Set인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용된다. Set인터페이스를 구현한 클래스로는 HashSet, TreeSet 등이 있다.

Map인터페이스

  • Map인터페이스는 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용된다. 키는 중복될 수 없지만 값은 중복을 허용한다.
  • 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.

Map.Entry인터페이스

  • Map.Entry인터페이스는 Map인터페이스의 내부 인터페이스이다. 내부 클래스와 같이 인터페이스도 인터페이스 안에 인터페이스를 정의하는 내부 인터페이스(inner interface)를 정의하는 것이 가능하다.

1.2 ArrayList

  • ArrayList는 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스이다.

  • 이는 List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 갖는다.

  • ArrayList는 Object배열을 이용해서 데이터를 저장한다. 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장한다.

import java.util.*;

class ArrayListEx1{
    public static void main(String[] args){
        ArrayList list1 = new ArrayList(10);
        list.add(new Integer(5));
        list.add(new Integer(4));
        list.add(new Integer(2));
        list.add(new Integer(0));
        list.add(new Integer(1));
        list.add(new Integer(3));
        
        ArrayList list2 = ArrayList(list.subList(1,4)); // 인덱스1부터 인덱스4 사이에 저장된 객체 반환
        point(list1, list2);
        
        Collections.sort(list1); // list1과 list2를 정렬한다.
        Collections.sort(list2); // Collections.sort(List l)
        print(list1, list2);
        ...
    }
}

Collection은 인터페이스이고, Collections는 클래스이다.

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

  • ArrayList나 Vector 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야하기 때문에 상당히 효율이 떨어진다는 단점을 가지고 있다. 그래서 처음에 인스턴스를 생성할 때, 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋다.

1.3 LinkedList

  • 배열의 단점
    1. 크기를 변경할 수 없다.
      • 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야 한다.
      • 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다.
    2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
      • 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만,
      • 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.
  • 이러한 배열의 단점을 보완하기 위해서 링크드 리스트(linked list)라는 자료구조가 고안되었다. 배열은 모든 데이터가 연속적으로 존재하지만 링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어 있다.

class Node{
    Node next; // 다음 요소의 주소를 저장
    Object obj; // 데이터를 저장
}
  • 링크드 리스트에서의 데이터의 삭제는 간단하다. 삭제하고자 하는 요소의 이전요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다.
  • 단 하나의 참조만 변경하면 삭제가 이루어지는 것이다. 배열처럼 데이터를 이동하기 위해 복사하는 과정이 없이 때문에 처리속도가 매우 빠르다.
  • 링크드 리스트는 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전요소에 대한 접근은 어렵다. 이점을 보안한 것이 더블 링크드 리스트(이중 연결리스트, doubly linked list)이다.
  • 더블 링크드 리스트는 단순히 링크드 리스트에 참조변수를 하나 더 추가하여 다음 요소에 대한 참조뿐 아니라 이전 요소에 대한 참조가 가능하도록 했을 뿐, 그 외에는 링크드 리스트와 같다.
class Node {
    Node next; // 다음 요소의 주소를 저장
    Node previous; // 이전 요소의 주소를 저장
    Object obj; // 데이터를 저장
}

  • 더블 링크드 리스트의 접근성을 보다 향상시킨 것이 '더블 써큘러 링크드 리스트(이중 원형 연결 리스트)'인데, 단순히 더블 리크드 리스트의 첫번째 요소와 마지막 요소를 서로 연결 시킨것이다.
  • 이렇게 하면, 마지막 요소의 다음 요소가 첫번째가 되고, 첫번째 요소의 이전 요소가 마지막 요소가 된다.

ArrayList와 LinkedList의 장단점

  1. 순차적으로 추가/삭제하는 경우에느느 ArrayList가 LinkedList보다 빠르다.
  2. 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
컬렉션읽기(접근시간)추가 / 삭제비 고
ArrayList빠르다느리다순차적인 추가삭제는 더 빠름 / 비효율적 메모리 사용
LinkedList느리다빠르다데이터가 많을수록 접근성이 떨어짐
  • 두 클래스의 장점을 이용해서 두 클래스를 조합해서 사용하는 방법도 생각해 볼 수 있다.
ArrayList al = new ArrayList(1000000);
for(int i=0;i<100000;i++) al.add(i+"");

LinkedList ll = new LinkedList(al);
for(int i=0;i<1000;i++) ll.add(500, "X");
  • 컬렉션 프레임웍에 속한 대부분의 컬렉션들은 이처럼 서로 변환이 가능한 생성자를 제공하므로 이를 이용하면 간단히 다른 컬렉션 클래스로 데이터를 옮길 수 있다.

1.4 Stack과 Queue

  • 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조로 되어 있고,
  • 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어 있다.
  • 스택은 ArrayList, 큐는 LinkedList로 구현하는 것이 편하다.
import java.util.*;

class StackQueueEx{
    public stsatic void main(String[] args){
        Stack st = new Stack();
        Queue q = new LinkedList(); // Queue인터페이스의 구현체인 LinkedList를 사용
        
        st.push("0");
        st.push("1");
        st.push("2");
    
        q.offer("0");
        q.offer("1");
        q.offer("2");
    
        System.out.println("= Stack = ");
        while(!st.empty()){
            System.out.println(st.pop());
        }
        
        System.out.println("= Queue =");
        while(!q.isEmpty()){
            System.out.println(q.poll());
        }
    }
}

스택과 큐의 활용

스택의 활용 예 : 수식 계산, 수식 괄호 검사, 워드프로세스의 undo/redo, 웹브라우저의 뒤로/앞으로
큐의 활용 예 : 최근 사용 문서, 인쇄작업 대기 목록, 버퍼(buffer)

PriorityQueue

  • Queue인터페이스의 구현체 중의 하나로, 저장한 순서에 관계없이 우선순위(priority)가 높은 것부터 꺼내게 된다는 특징이 있다. null은 저장할 수 없다. null을 저장하면 NullPointException이 발생한다.
  • PriorityQueue는 저장공간으로 배열을 사용하며, 각 요소를 '힙(heap)'이라는 자료구조의 형태로 저장한다. 힙은 이진트리의 한 종류로 가장 큰 값이나 가장 작은 값을 빠르게 찾을 수 있다는 특징이 있따.
import java.util.*;

class PriorityQueueEx{
    public static void main(String[] args){
        Queue pq = new PriorityQueue();
        pq.offer(3); // pq.offer(new Integer(3)); 오토박싱
        pq.offer(1);
        pq.offer(5);
        pq.offer(2);
        pq.offer(4);
        System.out.println(pq); // pq의 내부 배열을 출력
        Object obj = null;
        
        // PriorityQueue에 저장된 요소를 하나씩 꺼낸다.
        while((obj = pq.poll())!=null)
            System.out.println(obj);
    }
}

// 실행 결과
// [1,2,3,4,5]
// 1
// 2
// 3
// 4
// 5

Deque(Double-Ended Queue)

  • Queue의 변형으로, 한 쪽 끝으로만 추가/삭제 할 수 있는 Queue와 달리, Deque(덱, 또는 디큐)은 양쪽 끝에 추가/삭제가 가능하다. Deque의 조상은 Queue이며, 구현체로는 ArrayDeque과 LinkedList 등이 있다.
  • 덱은 스택과 큐를 하나로 합쳐놓은 것과 같으며 스택으로 사용할 수 있고, 큐로 사용할 수도 있다.

1.5 Iterator, ListIterator, Enumeration

Iterator

  • 컬렉션 프레임웍에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의하고, Collection인터페이스에서 'Iterator(Iterator를 구현한 클래스의 인스턴스)'를 반환하는 iterator()를 정의하고 있다.
  • ArrayList에 저장된 요소들을 출력하기 위한 코드는 다음과 같이 작성할 수 있다.
Collection c = new ArrayList(); // 다른 컬렉션으로 변경시 이 부분만 고치면 된다.
Iterator it = c.iterator();

while(it.hasNext()){
    System.out.println(it.next());
}
  • Collection에 없고 ArrayList에만 있는 메서드를 사용하는게 아니라면, Collection타입의 참조변수로 선언하는 것이 좋다. 만일 Collection인터페이스를 구현한 다른 클래스로 바꿔야 한다면 선언문 하나만 변경하면 나머지 코드는 검토하지 않아도 된다.

  • Map인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 쌍(pair)으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, 그 대신 keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어온 후에 다시 iterator()를 호출해야 Iterator을 얻을 수 있다.

ListIterator와 Enumeration

  • Enumeration은 컬렉션 프레임웍이 만들어지기 이전에 사용하던 것으로 Iterator의 구버젼이라고 생각하면 된다.
  • ListIterator는 Iterator를 상속받아서 기능을 추가한 것으로, 컬렉션의 요소에 접근할 때 Ierator는 단방향으로만 이동할 수 있는데 반해 ListIterator은 양방향으로의 이동이 가능하다.

1.6 Array

  • Array클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다. 같은 기능의 메서드가 배열의 타입만 다르게 오버로딩되어 있어서 많아 보이지만, 실제로는 그리 많지 않다.

배열의 복사 - copyOf(), copyOfRange()

배열 채우기 - fill(), serAll()

int[] arr = new int[5];
Arrays.fill(arr, 9);
Arrays.setAll(arr, ()->(int)(Math.random()*5)+1); // arr=[1,5,2,1,4]

배열의 정렬과 검색 - sort(), binarySearch()

  • binarySearch()는 배열에서 지정된 값이 저장된 위치(index)를 찾아서 반환하는데, 반드시 배열이 정렬된 상태이어야 올바른 결과를 얻는다. 그리고 만일 검색한 값과 일치하는 요소들이 여러 개 있다면, 이 중에서 어떤 것의 위치가 반환될지는 알 수 없다.

배열의 비교와 출력 - equals(), toString()

  • toString()은 일차원 배열어만 사용할 수 있으므로, 다차원 배열에는 deepTo String()을 사용해야 한다.
  • deepToString()은 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성하므로 2차원뿐만 아니라 3차원 이상의 배열에도 동작한다.
  • equals()도 일차원 배열에만 사용가능하므로, 다차원 배열의 비교에는 deepEquals()를 사용해야 한다.
  • 다차원 배열은 '배열의 배열'의 형태로 구성하기 때문에 equals()로 비교하면, 문자열을 비교하는 것이 아니라 '배열에 저장된 배열의 주소'를 비교하게 된다. 서로 다른 배열은 항상 주소가 다르기 때문에 false를 결과로 얻는다.

배열을 List로 변환 - asList(Object... a)

parallelXXX(), spliterator(), stream()

  • 'parallel'로 시작하는 이름의 메서드들이 있는데, 이 메서드들은 보다 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리하도록 한다.
  • 'spliterator()'는 여러 쓰레드가 처리할 수 있게 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환한다.
  • 'stream()'은 컬렉션을 스트림으로 변환한다.

1.7 Comparator와 Comparable

Comparable : 기본 정렬기준을 구현하는데 사용
Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

1.8 HashSet

  • HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.
  • HashSet에 새로운 요소를 추가할 때는 add메서드나 addAll메서드를 사용하는데, 만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 이 메서드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다.
  • ArrayList와 같이 List인터페이스를 구현한 컬렉션과 달리 HashSet은 ㅈ장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.

1.9 TreeSet

  • TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다. 이전 검색 트리는 정렬, 검색, 범위검색(range search)에 높은 성능을 보이는 자료구조이며 TreeSet은 이진 검색 트리의 성능을 향상시킨 '레드-블랙 트리(Red-Black Tree)'로 구현되어 있다.
  • 그리고 Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않는다.

트리(tree)는 각 노드간의 연결된 모양이 나무와 같다고 해서 붙여진 이름이다.

class TreeNode{
    TreeNode left; // 왼쪽 자식노드
    Object element; // 객체를 생성하기 위한 참조변수
    TreeNode right; // 오른쪽 자식노드
}

이진 검색 트리(binaray search tree)는

  • 모든 노드는 최대 두 개의 자식노드를 가질 수 있다.
  • 왼쪽 자식노드의 값은 부모노드의 값보다 작고 오른쪽자식노드의 값은 부모노드의 값보다 커야한다.
  • 노드의 추가 삭제에 시간이 걸린다.(순차적으로 저장하지 않으므로)
  • 검색(범위검색)과 정렬에 유리하다.
  • 중복된 값을 저장하지 못한다.

1.10 HashMap과 Hashtable

  • Hashtable과 HashMap의 관계는 Vector와 ArrayList의 관계와 같아서 Hashtable보다는 새로운 버전인 HashMap을 사용할 것을 권한다.
  • HashMap은 Map을 구현했으므로 앞에서 살펴본 Map의 특징, 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. 그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.
  • HashMap은 키와 값을 각각 Object타입으로 저장한다. 즉 (Object, Object)의 형태로 저장하기 때문에 어떠한 객체도 저장할 수 있지만 키는 주로 String을 대문자 또는 소문자로 통일해서 사용하곤 한다.

    키(key) : 컬렉션 내의 키(key) 중에서 유일해야 한다.
    값(value) : 키(key)와 달리 데이터의 중복을 허용한다.

  • Map의 값은 중복을 허용하지만 키는 중복을 허용하지 않기 때문에 저장하려는 두 데이터 중에서 어느 쪽을 키로 할 것인지를 잘 결정해야 한다.

    Hashtable은 키(key)나 값(value)으로 null을 허용하지 않지만, HashMap은 허용한다. 그래서 'map.put(null, null);'이나 'map.get(null);'과 같이 할 수 있다.

해싱과 해시함수

  • 해싱이란 해시함수(hash function)를 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는 기법을 말한다. 해시함수는 데이터가 저장되어 있는 곳을 알려 주기 때문에 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다.

  • 해싱을 구현한 컬렉션 클래스로는 HashSet, HashMap, Hashtable 등이 있다.

  • 해싱에 사용하는 자료구조는 다음과 같이 배열과 링크드 리스트의 조합으로 되어 있다.

  • 저장할 데이터의 키를 해시함수에 넣으면 배열의 한 요소를 얻게 되고, 다시 그 곳에 연결되어 있는 링크드 리스트에 저장하게 된다.

  1. 검색하고자 하는 값의 키로 해시함수를 호출한다.
  2. 해시함수의 계산결과(해시코드)로 값이 저장되어 있는 링크드 리스트를 찾는다.
  3. 링크드 리스트에서 검색한 키와 일치하는 데이터를 찾는다.
  • 배열은 배열의 크기가 커져도, 원하는 요소가 몇 번째에 있는 지만 알면 아래의 공식에 의해서 빠르게 원하는 값을 찾을 수 있다.

    배열의 인덱스가 n인 요소의 주소 = 배열의 시작주소 + type의 size*n

  • 하나의 링크드 리스트에 최소한의 데이터만 저장하려면, 저장될 데이터의 크기를 고려해서 HashMap의 크기를 적절하게 지정해주어야 하고, 해시함수가 서로 다른 키에 대해서 중복된 해시코드의 반환을 최소화해야 한다. 그래야 HashMap에서 빠른 검색시간을 얻을 수 있다.

  • 그래서 해싱을 구현하는 과정에서 제일 중요한 것은 해시함수의 알고리즘이며, 아래의 예처럼 첫 번째 문자를 뽑아서 정수로 반환하여 찾는다.

int hashFunction(String key){
    return Integer.parseInt(key.substring(0,1));
}

1.11 TreeMap

  • TreeMap은 이름에서 알 수 있듯이 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. 그래서 검색과 정렬에 적합한 컬렉션 클래스이다.
  • 검색에 관한 대부분의 경우에서 HashMap이 TreeMap보다 더 뛰어나므로 HashMap을 사용하는 것이 좋다. 다만 범위검색이나 정렬이 필요한 경우에는 TreeMap을 사용하는 것이 좋다.

1.12 Properties

  • Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션클래스이다.
  • 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다.

1.13 Collections

  • Arrays가 배열에 관련된 메서드를 제공하는 것처럼, Collections는 컬렉션과 관련된 메서드를 제공한다.

컬렉션의 동기화

  • 멀티 쓰레드(multi-thread) 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성(consistency)을 유지하기 위해서는 공유되는 객체에 동기화(synchronization)가 필요하다.
  • Collections클래스에는 다음과 같은 동기화 메서드를 제공하고 있으므로, 동기화가 필요할 때 해당하는 것을 사용하면 된다.
static Collection synchronizedCollection(Collection c)
static List synchronizedCollection(List list)
static Set synchronizedCollection(Set s)
static Map synchronizedCollection(Map m)
static SortedSet synchronizedCollection(SortedSet s)
static SortedMap synchronizedCollection(SortedMap m)

// 사용법
List syncList = Collections.synchronizedList(new ArrayList(...));

변경 불가 컬렉션 만들기

  • 컬렉션에 저장된 데이터를 보호하기 위해서 컬렉션을 변경할 수 없게, 즉 읽기 전용으로 만들어야할 때가 있다. 주로 멀티 쓰레드 프로그래밍에서 여러 쓰레드가 하나의 컬렉션을 공유하다보면 데이터가 손상될 수 있는데, 이를 방지하려면 아래의 메서드를 이용하면 된다.
static Collection unmodifiableCollection(Collection c)
static List unmodifiableList(List list)
static Set inmodifiableSet(Set s)
static Map inmodifiableSet(Map m)
static NavigableSet inmodifiableSet(NavigableSet s)
static SortedSet inmodifiableSet(SortedSet s)
static NavigableMap inmodifiableSet(NavigableMap m)
static SortedMap inmodifiableSet(SortedMap m)

싱글톤 컬렉션 만들기

  • 단 하나의 객체만을 저장하는 컬렉션을 만들 수 있다.

한 종류의 객체만 저장하는 컬렉션 만들기

  • 컬렉션에 모든 종류의 객체를 저장할 수 있다는 것은 장점이기도 하고 단점이기도 하다. 대부분의 경우 한 종류의 객체를 저장하며, 컬렉션에 지정된 종류의 객체만 저장하도록 제한할 수 있다.

1.14 컬렉션 클래스 정리 & 요약

컬렉션특 징
ArrayList배열기반, 데이터의 추가와 삭제에 불리. 순차적인 추가 삭제는 제일 빠름. 임의의 요소에 대한 접근성(accessibility)이 뛰어남.
LinkedList연결기반. 데이터의 추가와 삭제에 유리. 임의의 요소에 대한 접근성이 좋지 않다.
HashMap배열과 연결이 결합된 형태. 추가, 삭제, 검색, 접근성이 모두 뛰어남. 검색에는 최고성능을 보인다.
TreeMap연결 기반. 정렬과 검색(특히 범위검색)에 적합. 검색기능은 HashMap보다 떨어짐.
StackVector를 상속받아 구현
QueueLinkedList가 Queue인터페이스를 구현
PropertiesHashtable을 상속받아 구현
HashSetHashMap을 이용해서 구현
TreeSetTreeMap을 이용해서 구현
LinkedHashMap / LinkedHashSetHashMap과 HashSet에 저장순서 유지 기능을 추가
profile
데이터 분석하고 있습니다

0개의 댓글