* Collection

> 가장 상위 interface


* List

> 순서있는 집합 처리를 위한 interface

> index 가 있어 위치를 지정하며 값을 찾을 수 있다

> 중복을 허용하며, List 를 이용하는 대표적인 클래스로 Vector 가 있다


* Vector

> 크기를 객체 생성시 지정할 필요없는 배열 클래스

> 동기화 기능이 포함되어 있다

> 내부적으로 배열 사용

: 저장할 공간이 없으면 보다 큰 새로운 배열을 생성하여 기존의 배열에 저장된 내용을 새로운 배열로 복사한다

> trimToSize()

: 객체가 존재하지 않는 할당된 공간을 GC를 통해 해제한다

> ensureCapacity(n)

: 할당된 공간이 최소 n 이 되도록 만든다. 이미 n 이상인 경우에는 아무런 동작을 하지 않는다

> setSize(n)

: 할당된 공간이 n 이 되도록 만든다. n보다 큰 경우에는 할당을 해제하고, 작은 경우에는 새로운 인스턴스를 생성한다

> clear()

: 모든 요소를 삭제한다


* Stack

> Vector 클래스를 상속 받아 구현됨


* ArrayList

> Vector 와 비슷한 동기화 처리가 되어있지 않다
> 내부적으로 배열 사용

: 저장할 공간이 없으면 보다 큰 새로운 배열을 생성하여 기존의 배열에 저장된 내용을 새로운 배열로 복사한다

> 데이터 추가 삭제에 불리하지만, 임의의 요소에 대한 접근성이 뛰어나다


* LinkedList

> ArrayList 와 비슷하지만 Queue interface 를 구현했기 때문에 FIFO 큐 작업을 수행

> Vector 와 ArrayList 에 비해 추가, 삭제 기능이 향상되었지만, 임의의 요소에 대한 접근성이 좋지 않다


* List 성능 비교

> Add (Sequential)

(fast) ArrayList < Vector < LinkedList (Slow)

> Get (Sequential)

: (Fast) LinkedList (Peak(), poll()) < ArrayList < Vector < LinkedList (Slow)

: 동기화 때문에 Vector 가 ArrayList 보다 느리다


* List 의 Element 삭제

> 앞에서부터 삭제하면 자리 이동이 일어나기 때문에 원하는 결과를 얻지 못할 수 있다. 따라서, index를 뒤에서부터 확인하고 삭제 해야한다




* Set

> 순서가 없으며, 중복 허용하지 않는 집합 처리를 위한 interface


* SortedSet

> 오름차순을 갖는 Set interface


* HashSet

> HashMap 을 이용해서 구현

> Data 를 HashTable 에 담는 클래스로 순서없이 저장

> equals() 와 hashCode() 를 사용하여, 이미 포함되어 있는 객체인지 확인. 따라서, 2개의 메소드를 override 하여 사용하면 용도에 맞게 구현 가능


* TreeSet

> TreeMap 을 이용해서 구현

> Red-Black Tree 에 data 를 담음

> 값에 따라서 정렬된 순서로 저장됨 (즉, 저장 순서를 유지 하지 않음)

> Hash Set 보다 느리다

> 데이터를 담으면서 동시에 정렬할 때 유용


* LinkedHashSet

> HashTable 에 데이터를 담음

> 저장된 순서에 따라서 순서가 결정됨 (HashSet 과의 차이점)


* Set 성능 비교

> Add (Sequential)

: (Fast) HashSet = LinkedHashSet < TreeSet (Slow)
    - TreeSet 은 순서에 따라 삽입 동작을 수행

> Get (Sequential)

: (Fast) LinkedHashSet < HashSet < TreeSet (Slow)

> Get (Random)

: (Fast) HashSet = LinkedHashSet < TreeSet (Slow)

> 참고로, Size 설정 후 HashSet 의 add() 를 이용하는 경우가, 그렇지 않은 경우보다 빠르다




* Queue

> 여러 객체를 처리하기 전에 담아서 처리할 때 사용하기 위한 interface


* PriorityQueue

> Queue 에 추가된 순서와 상관없이 먼저 생성한 객체가 먼저 나온다


* BlockingQueue

> 크기가 지정되어 있는 Queue 에 공간이 더 이상 없을 때, 공간이 생길 때까지 대기하도록 만들어진 Queue 를 의미


* LinkedBlockingQueue

> 크기를 정할 수 있는 FIFO 기반의 Link Node 를 사용하는 Blocking Queue


* ArrayBlockingQueue

> 크기가 정해져 있는 FIFO 기반의 Blocking Queue


* PriorityBlockingQueue

> 크기가 정해져 있지 않고, 객체의 생성 순서에 따라 순서가 저장되는 Blocking Queue


* DelayQueue

> Queue 가 대기하는 시간을 지정하여 처리하도록 되어있는 Queue


* SynchronousQueue

> put() 을 호출하면 다른 Thread 에서 take() 를 호출할때 까지 대기하도록 되어있는 Queue




* Map

> Key, Value 쌍으로 구성된 객체의 집합을 처리하기 위한 interface

> 중복된 Value 는 허용하지만,  Key 는 허용하지 않는다


* SortedMap

> Key 를 오름차순으로 정렬하는 Map interface


* HashTable

> 동기화 기능이 포함되어 있다

> key, value 의 값으로 null 을 허용하지 않는다

> ArrayList 와 Vector 에 비해 검색 기능이 향상되었다


* HashMap

> HashTable 에 Data 를 담는다

> HashTable 과 달리 null 값을 허용하며, 동기화 기능이 없다

> 배열과 연결이 결합된 형태로, ArrayList 와 Vector 에 비해 검색 기능이 향상되었으며 추가, 삭제, 검색, 접근성이 모두 뛰어나다


* TreeMap

> Red-Black Tree 에 Data 를 담는다

: LinkedList 에 비해 검색, 범위 검색, 정렬기능이 향상되었다

> TreeSet 과 달리 Key 에 의해 순서가 정해지며, 정렬이 필요한 경우에 사용한다

> 연결 기반의 구조로 범위 검색에 적합하며, 검색 성능은 HashMap 보다 느리다


* LinkedHashMap

> HashMap 과 다른 점은 Doubly-linked List 를 이용해 Data 담는다

: (HashMap 과 Hashtable 에 비해) 순서 유지 기능이 향상되었다


* Map 성능 비교

> Add

: 모두 비슷하다

> Get

: (Fast) HashMap (Seq) = HashMap (Random) = LinkedHashMap (Seq) = LinkedHashMap (Random) < HashTable (Seq) = HashTable (Random)

  < TreeMap (Seq) < TreeMap (Random) (Slow)




* Collections 클래스의 동기화

> 자체적으로 아래와 같은 동기화 메서드를 제공한다

Collections.synchronizedList(new ArrayList<>());

Collections.synchronizedMap(new HashMap<>());

Collections.synchronizedSet(new HashSet<>());

Collections.synchronizedCollection(new ArrayList<>());


* Array vs LinkedList

> Array

: 장점

- 구조가 간단하다

- 사용하기 쉽다

- Access time 이 빠르다

: 단점

- Size 변경이 불가하다

- 비순차적인 데이터 추가, 삭제가 느리다

> LinkedList

: 장점

- 비순차적인 데이터 추가, 삭제가 빠르다

: 단점

- Access time 이 느리다 (Data가 많을수록 접근성이 떨어진다)


> 성능 비교

: Sequential Add & Delete

- (Fast) ArrayList < LinkedList (Slow)

: Random Add & Delete

- (Fast) LinkedList < ArrayList (Slow)


* Iterator

> list.iterator() 를 통해 읽어오는 결과는 저장 순서와 동일하다

> map.keyset().iterator() 를 통해 읽어오는 결과는 저장 순서와 다르다
    : Set 은 순서를 유지하지 않기 때문이다


* ListIterator

> 양방향으로 이동 가능


* Enumeration

> Iterator 의 구 버전 (Collection Framework 가 만들어지기 이전에 사용)




'SW > ::: Java' 카테고리의 다른 글

JVM (시작, 종료, 예외처리, 동기화)  (0) 2020.10.09
Thread (쓰레드)  (0) 2020.10.09
String  (0) 2020.10.05
Late Binding  (0) 2020.10.04
////200927 JDK 15 // early16  (0) 2020.09.27

+ Recent posts