[java] Collection 공부해보자!
Collection 이란?
애플리케이션을 개발하다 보면 다수의 객체를 저장해 두고 필요할 때 마다 꺼내서 사용하는 경우가 많다
배열을 사용하면 좋지만 저장할 수 있는 개체 수가 배열을 생성할 때 결정되기 때문에 불특정 다수의 객체를 저장하는 데 어려움이 있다
=> 이러한 문제점을 해결하기 위해 java.util 패키지에 컬렉션과 관련된 인터페이스와 컬렉션을 포함시켜 놓았다
List 컬렉션
List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다
객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고 인덱스로 다양한 기능 수행
사용 메소드
- 객체 추가 : add, set
- 객체 검색 : contains, get, isEmpty, size
- 객체 삭제 : clear, remove
-
ArrayList(LIST<E.> list = new ArrayList<E.>();)
객체를 추가하면 객체가 인덱스로 관리된다
일반 배열과 유사하지만 크기가 가변적이어서 저장 공간보다 큰 객체가 들어오면 자동적으로 저장 용량이 증가한다
-
Vector(LIST<E.> list = new Vector<E.>();)
ArrayList와 동일한 내부 구조, 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자를 호출하면 된다
Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 실행할 수 없다
-
LinkedList(LIST<E.> list = new LinkedList<E.>();)
인덱스로 객체를 관리하지 않고 인접 참조를 링크해서 체인처럼 관리한다
ArrayList는 특정 인덱스의 객체가 제거되면 뒤의 객체는 인덱스가 1씩 앞으로 당겨지지만 LinkedList는 앞 뒤 링크만 변경되고 나머지는 변경 되지 않는다
따라서 빈번한 객체 삽입과 삭제가 일어나는 곳에서 좋은 성능을 발휘한다
## Set 컬렉션
#### Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다
**사용 메소드**
*- 객체 추가 : add*
*- 객체 검색 : contains, isEmpty, 반복자 iterator, size*
*- 객체 삭제 : clear, remove*
##### iterator 메소드를 호출하면 반복자를 사용할 수 있는데, 하나의 객체를 가져올 때는 iterator.next() / 저장된 개수만큼 가져올 때는 hasnext()를 for문에 사용함
-
HashSet(Set<E.> set = new HashSet<E.>();)
객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다. 이 때 동일한 객체란 꼭 같은 인스턴스를 뜻하는 것이 아니라 해시코드가 같은 것을 의미한다
문자열을 HashSet에 저장하는 경우 같은 문자열을 갖는 객체는 동등한 객체로 간주되는데 hashCode()의 리턴 값을 같게, equals()의 리턴 값은 true가 나오게 만들었다 -
LinkedHashSet
-
TreeSet(TreeSet<E.> treeSet = new TreeSet<String.>();)
TreeSet은 이진 트리를 기반으로 한 컬렉션이다
TreeSet에 객체를 저장하면 자동으로 정렬되는데 부모 값과 비교하여 낮은 것은 왼쪽 자식 노드, 큰 것은 오른쪽 자식 노드에 저장된다
문자열 찾을 때 => NavigableSet<E.> set = treeSet.subSet(E 시작 객체, boolean 시작 객체의 포함 여부, E 끝 객체, boolean 끝 객체의 포함 여부)
Map 컬렉션
Map 컬렉션은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다
키는 중복될 수 없지만 값은 중복될 수 있다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치가 된다
사용 메소드
- 객체 추가 : put
- 객체 검색 : contains, containsValue, get, boolean, keySeti, entrySet, isEmpty, size, values
- 객체 삭제 : clear, remove
-
HashMap(Map<K,V> map = new HashMap<K,V>();)
Map 인터페이스를 구현한 대표적인 Map 컬렉션
동일한 키가 될 조건은 hashCode()의 리턴 값이 같아야 하고, equals() 메소드가 true를 리턴해야 한다 -
Hashtable(Map<K,V> map = new Hashtable<K,V>();)
HashMap과 동일한 내부 구조를 가지고 있다
차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드를 실행할 수 없음 -
Properties
Properties는 Hashtable의 하위 클래스이기 때문에 Hashtable의 모든 특징을 가지고 있다
차이점은 Properties는 키와 값을 String 타입으로만 제한한 컬렉션이다 -
TreeMap
이진트리를 기반으로 한 Map 컬렉션
TreeMap에 객체를 저장하면 자동으로 정렬 되는데, 부모 키 값과 비교해서 키 값이 낮은 것은 왼쪽 노드에 키 값이 높은 것은 오른쪽 자식 노드에 저장한다
Stack과 Queue
Stack(Stack<E.> stack = new Stack<E.>();) : LIFO 자료 구조 제공
스택의 주요 메소드로는 push, peek, pop
ex) JVM 스택 메모리
Queue(Queue<E.> queue = new LinkedList<E.>();) : FIFO 자료 구조 제공
큐의 주요 메소드로는 offer, peek, pull
ex) 스레드풀
동기화된 컬렉션
동기화된 컬렉션은 멀티 스레드 환경에서 하나의 스레드가 요소를 안전하게 처리하게 도와주지만 전체 요소를 빠르게 처리하지 못한다
하나의 스레드가 요소를 처리할 때 전체 잠금이 발생하여 다른 스레드는 대기 상태가 된다 따라서, 병렬처리가 가능한 컬렉션이 필요
-
Map<K,V> map = new ConcurrentHashMap<K,V>();
-
Queue<E.> queue = new ConcurrentLinkedQueue<E.>();
[제가 직접 구매한 이것이 자바다 책에서 일부 캡처해왔습니다.]
Author And Source
이 문제에 관하여([java] Collection 공부해보자!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kkw9312/javaCollection저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)