애플리케이션을 개발하다 보면 다수의 객체를 저장해 두고 필요할 때 마다 꺼내서 사용하는 경우가 많다
배열을 사용하면 좋지만 저장할 수 있는 개체 수가 배열을 생성할 때 결정되기 때문에 불특정 다수의 객체를 저장하는 데 어려움이 있다
=> 이러한 문제점을 해결하기 위해 java.util 패키지에 컬렉션과 관련된 인터페이스와 컬렉션을 포함시켜 놓았다
사용 메소드
- 객체 추가 : add, set
- 객체 검색 : contains, get, isEmpty, size
- 객체 삭제 : clear, remove
객체를 추가하면 객체가 인덱스로 관리된다
일반 배열과 유사하지만 크기가 가변적이어서 저장 공간보다 큰 객체가 들어오면 자동적으로 저장 용량이 증가한다
ArrayList와 동일한 내부 구조, 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자를 호출하면 된다
Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 실행할 수 없다
인덱스로 객체를 관리하지 않고 인접 참조를 링크해서 체인처럼 관리한다
ArrayList는 특정 인덱스의 객체가 제거되면 뒤의 객체는 인덱스가 1씩 앞으로 당겨지지만 LinkedList는 앞 뒤 링크만 변경되고 나머지는 변경 되지 않는다
따라서 빈번한 객체 삽입과 삭제가 일어나는 곳에서 좋은 성능을 발휘한다
## Set 컬렉션
#### Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다
**사용 메소드**
*- 객체 추가 : add*
*- 객체 검색 : contains, isEmpty, 반복자 iterator, size*
*- 객체 삭제 : clear, remove*
##### iterator 메소드를 호출하면 반복자를 사용할 수 있는데, 하나의 객체를 가져올 때는 iterator.next() / 저장된 개수만큼 가져올 때는 hasnext()를 for문에 사용함
객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다. 이 때 동일한 객체란 꼭 같은 인스턴스를 뜻하는 것이 아니라 해시코드가 같은 것을 의미한다
문자열을 HashSet에 저장하는 경우 같은 문자열을 갖는 객체는 동등한 객체로 간주되는데 hashCode()의 리턴 값을 같게, equals()의 리턴 값은 true가 나오게 만들었다
TreeSet은 이진 트리를 기반으로 한 컬렉션이다
TreeSet에 객체를 저장하면 자동으로 정렬되는데 부모 값과 비교하여 낮은 것은 왼쪽 자식 노드, 큰 것은 오른쪽 자식 노드에 저장된다
문자열 찾을 때 => NavigableSet<E.> set = treeSet.subSet(E 시작 객체, boolean 시작 객체의 포함 여부, E 끝 객체, boolean 끝 객체의 포함 여부)
사용 메소드
- 객체 추가 : put
- 객체 검색 : contains, containsValue, get, boolean, keySeti, entrySet, isEmpty, size, values
- 객체 삭제 : clear, remove
Map 인터페이스를 구현한 대표적인 Map 컬렉션
동일한 키가 될 조건은 hashCode()의 리턴 값이 같아야 하고, equals() 메소드가 true를 리턴해야 한다
HashMap과 동일한 내부 구조를 가지고 있다
차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드를 실행할 수 없음
Properties는 Hashtable의 하위 클래스이기 때문에 Hashtable의 모든 특징을 가지고 있다
차이점은 Properties는 키와 값을 String 타입으로만 제한한 컬렉션이다
이진트리를 기반으로 한 Map 컬렉션
TreeMap에 객체를 저장하면 자동으로 정렬 되는데, 부모 키 값과 비교해서 키 값이 낮은 것은 왼쪽 노드에 키 값이 높은 것은 오른쪽 자식 노드에 저장한다
ex) JVM 스택 메모리
ex) 스레드풀
[제가 직접 구매한 이것이 자바다 책에서 일부 캡처해왔습니다.]