Collection Interface
자바의 인터페이스를 이용해 구현된 것으로 데이터를 저장하는 자료구조를 정의하는 프레임워크입니다.
Collection 인터페이스의 종류
종류 | 특징 | 구현 클래스 |
List<E> | 순서가 있는 자료구조 | Vector, ArrayList, LinkedList, Stack |
Set<E> | 순서가 없으며 중복값을 허용하지 않는 자료구조 | HashSet, TreeSet |
Map<K,V> | key와 value로 이루어진 자료구조로 key는 중복값을 허용하지 않음 | HashMap, TreeMap |
Queue<E> | 선입선출의 자료구조 | Queue |
Deque<E> | 양방향 선입선출 자료구조 | Deque |
Collection 인터페이스의 기본 Method
method | return | 설명 |
size() | int | collection 객체의 길이(담긴 데이터의 갯수) |
isEmpty() | boolean | collection 객체가 비었는지 확인 |
contains(Object obj) | boolean | obj가 collection 객체에 담겼는지 확인 |
containsAll(Collection<E> obj) | boolean | collection 객체를 collection 객체에 통째로 담겨있는지 확인 |
retainAll(Collection<E> obj) | boolean | Collection 객체와 obj의 교집합을 구하는 메소드 |
add(Object obj) | boolean | obj를 collection 객체에 담음 |
addAll(Collection<E> obj) | boolean | collection 객체를 collection 객체에 통째로 담음 |
remove(Object obj) | boolean | obj를 collection 객체에서 제거 |
removeAll(Collection<E> obj) | boolean | collection 객체를 collection 객체에 통째로 제거 |
removeIf(Predicate <E> filter) | boolean | filter 조건에 해당되는 elements를 삭제 |
iterator() | Iterator<E> | 순서가 없는 collection 객체에서 값을 하나씩 꺼내주는 기능 |
clear() | Collection 객체를 초기화(모든 elements를 삭제) | |
toArray() | T[] | Collection 객체를 배열로 변환 |
For-each 사용해 객체 1개씩 꺼내기
for (Object o : collection)
System.out.println(o);
static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext(); )
if (!cond(it.next()))
it.remove();
}
iterator 메소드
- boolean hasNext() : 탐색할 elements가 남아 있는지 여부를 반환
- Object next() : 다음 elements를 반환
- void remove() : iterator로 탐색된 마지막 요소를 삭제
removeIf
collection.removeIf(a->(a%2!=0) );
List
삽입 순서를 유지하고 중복을 허용하는 Collection입니다.
객체를 인덱스로 관리하며, 데이터를 저장하면 자동으로 인덱스가 부여됩니다.
인덱스로 객체를 검색, 삭제할 수 있습니다.
구분 | List Method | return | 설명 |
객체 추가 | add(Object obj) | boolean | list의 맨 끝에 obj를 추가 |
add(int index, Object obj) | list 사이 index 위치에 obj를 삽입 | ||
set(int index, Object obj) | index 위치의 값을 obj로 바꿈 | ||
객체 검색 | contains(Object obj) | boolean | obj를 포함되어 있는지를 반환 |
get(int index) | Object | index 위치의 값을 반환 | |
isEmpty() | boolean | List 객체가 비어있는지 반환 | |
size() | int | List가 가진 요소의 갯수(길이) | |
clear() | List를 초기화(모든 요소를 삭제) | ||
remove(int index) | Object | index위치의 값을 삭제 후 반환 | |
remove(Object o) | boolean | obj를 List에서 삭제 |
Collection method | 설명 |
sort(List<E> list) | mergeSort 알고리즘을 이용해 객체를 정렬하는 메소드 |
suffle(List<E> list) | elements를 랜덤하게 섞는 메소드 |
reverse(List<E> list) | elements의 순서를 뒤집는 메소드 |
rotate(List<E> list, int distance) | 특정 거리에 있는 elements를 서로 교환 |
swap(List<E> list, int i, int j) | i와 j 위치에 있는 elements를 교환 |
replaceAll(List<E> list, Object obj1, Object obj2) | obj1와 일치하는 값을 모두 obj2로 변환 |
fill(List <E> list, Object obj) | list를 모두 obj로 채움 |
copy(List <E> list1, List <E> list2) | list1을 list2에 복사 |
indexOfSubList(List <E> list1, List <E> list2) | list1에서 list2로 이루어진 첫번째 부분집합의 시작위치를 반환 |
lastIndexOfSubList(List <E> list1, List <E> list2) | list1에서 list2로 이루어진 마지막 부분집합의 시작위치를 반환 |
List<String> arr1 = Arrays.asList("ABCABCABC".split(""));
List<String> arr2 = Arrays.asList("ABC".split(""));
int firstIndex = Collections.lastIndexOfSubList(arr1, arr2);
int lastIndex = Collections.indexOfSubList(arr1, arr2);
System.out.println("firstIndex="+firstIndex);
System.out.println("lastIndex="+lastIndex);
firstIndex=6
lastIndex = 0
ArrayList
객체를 인덱스로 관리하는 List의 클래스
배열과 달리 저장용랑이 고정되어 있지 않다. 값이 추가되면 저장용량이 자동으로 늘어난다.
객체를 추가하면 인덱스가 0부터 순차적으로 부여되고, 중간 값이 삭제되면 인덱스가 당겨진다.
LinkedList
요소끼리 참조 정보를 연결해서 체인처럼 관리되는 List의 클래스
객체를 중간에 삽입하거나 삭제할 때는 연결정보만 바꾸면 되기 때문에 ArrayList보다는 빠르다.
그러나 순차적으로 탐색하거나, 인덱스를 이용해 값에 접근하는 경우에는 참조정보를 모두 탐색해야 하기 때문에 ArrayList보다 느리다.
삭제와 삽입이 자주 일어나는 경우에는 LinkedList, 인덱스를 이용한 검색이 자주 일어나는 경우는 ArrayList를 사용하는 것이 좋다.
Vector
ArrayList와 동일한 구조를 가지고 있다.
동기화된 메소드로 구성되어 있어 한번에 하나의 스레드만이 vector 객체를 이용할 수 있다.
Stack
Set
저장 순서가 유지되지 않고, 값을 중복해서 저장할 수 없다.
구분 | Set Method | return | 설명 |
추가 | add(Object obj) | boolean | obj를 저장. 성공시 true, 실패시 false |
검색 | contains(Object obj) | boolean | obj가 포함되어 있는지를 반환 |
isEmpty() | boolean | Set이 비어있는지를 반환 | |
iterator() | Iterator | Set에 저장된 요소를 하나씩 가져오는 반복자 | |
size() | int | Set에 저장된 요소의 갯수 | |
삭제 | clear() | Set 객체를 초기화(요소를 모두 삭제) | |
remove(Object obj) | boolean | obj를 삭제 |
HashSet
객체를 순서없이 저장하고 동일한 객체는 중복 저장하지 않는다.
객체를 저장하기 전에 hashcode() 메소드를 호출해서 해시코드를 얻어내고 저장되어 있는 요소들의 해시코드와 비교한다. 해시코드가 같으면 동일한 객체로 판단해 저장하지 않는다.
Set<E> set = new HashSet<E>();
TreeSet
이진 트리 Binary tree 구조로 객체를 저장한다.
TreeSet에 객체를 저장하면 자동으로 정렬하는데, 부모 값과 비교해서 작은 것은 왼쪽 자식 노드에, 큰 것은 오른쪽 자식 노드에 저장한다.
메소드 | Return | 설명 |
first() | Object | 가장 작은 객체를 반환(가장 왼쪽) |
last() | Object | 가장 큰 객체를 반환(가장 오른쪽) |
lower(Object obj) | Object | 주어진 객체 다음으로 작은 객체를 리턴 |
higher(Object obj) | Object | 주어진 객체 다음으로 큰 객체를 리턴 |
floor(Object obj) | Object | 주어진 객체와 동등한 객체가 있으면 그 객체를 리턴 없으면 다음으로 작은 객체를 리턴 |
ceiling(Object obj) | Object | 주어진 객체와 동등한 객체가 있으면 그 객체를 리턴 없으면 다음으로 큰 객체를 리턴 |
pollFirst() | Object | 가장 작은 객체를 반환하고 TreeSet에서 삭제 |
pollLast() | Object | 가장 큰 객체를 반환하고 TreeSet에서 삭제 |
descendingIterator() | Iterator<E> | 내림차순으로 정렬된 Iterator를 반환 |
descendingSet() | NavigableSet<E> | 내림차순으로 정렬된 NavigableSet을 반환 |
headSet(Object obj, boolean inclusive) | NavigableSet<E> | obj보다 작은 객체를 NavigableSet으로 반환 inclusive가 true이면 obj도 포함 |
tailSet(Object obj, boolean inclusive) | NavigableSet<E> | obj보다 큰 객체를 NavigableSet으로 반환 inclusive가 true이면 obj도 포함 |
subSet(Object obj1, boolean inclusive1, Object obj1, boolean inclusive2) |
NavigableSet<E> | obj1보다 크고 obj2보다 작은 객체를 NavigableSet으로 반환 inclusive가 true이면 obj도 포함 |
NevigatableSet<E> descendingSet = treeSet.descendingSet();
LinkedHashSet
Map
Key와 Value로 구성된 객체를 저장하는 클래스이다. key는 중복해서 저장될 수 없다. 만약 기존에 저장된 key와 동일한 key로 값을 저장하면 새로운 값으로 대체된다.
구분 | Map Method | return | 설명 |
추가 | put(Key, value) | Object | Key와 value를 저장. 저장되면 value를 리턴 |
검색 | containsKey(Key) | boolean | Key가 포함되어 있는지를 반환 |
containsValue(Value) | boolean | Values가 포함되어 있는지를 반환 | |
entrySet() | Set<k,v> | Map객체를 Key와 value로 구성된 set 객체로 반환 | |
get(Key) | Value | Key의 Value를 반환 | |
isEmpty() | boolean | Map이 비어있는지를 여부 | |
keySet() | Set<k> | Key를 Set 객체로 반환 | |
size | int | 저장된 객체의 갯수 | |
values() | Collection | 저장된 모든 Value를 Collection으로 반환 | |
삭제 | clear() | Set 객체를 초기화(요소를 모두 삭제) | |
remove(Object obj) | boolean | obj를 삭제 |
HashMap
객체를 저장하기 전에 hashcode() 메소드를 호출해서 해시코드를 얻어내고 저장되어 있는 요소들의 해시코드와 비교한다. 해시코드가 같으면 동일한 객체로 판단한다.
Map<Integer, String> map = new HashMap<Integer, String>();
HashTable
HashMap와 동일한 구조를 가지고 있다.
동기화된 메소드로 구성되어 있어 한번에 하나의 스레드만이 HashTable 객체를 이용할 수 있다.
Properties
HashTable의 하위 클래스인데, key와 value에 String 타입만 허용한다.
어플리케이션의 옵션정보, 데이터베이스 연결정보, 국제화 다국어 정보가 저장된 프로퍼티를 읽을 때 주로 사용한다.
LinkedHashMap
TreeMap
이진 트리 Binary tree 구조로 객체를 저장한다.
TreeMap에 객체를 저장하면 자동으로 정렬하는데, 부모 노드의 Key값과 비교해서 작은 것은 왼쪽 자식 노드에, 큰 것은 오른쪽 자식 노드에 저장한다.
메소드 | Return | 설명 |
firstEntry() | Map.Entry<K,V> | 가장 작은 Map.Entry를 반환(가장 왼쪽) |
lastEntry() | Map.Entry<k,v> | 가장 큰 Map.Entry를 반환(가장 오른쪽) |
lowerEntry(Key) | Map.Entry<k,v> | 주어진 Key 다음으로 작은 Map.Entry를 리턴 |
higherEntry(Key) | Map.Entry<k,v> | 주어진 Key 다음으로 큰 Map.Entry를 리턴 |
floorEntry(Key) | Map.Entry<k,v> | 주어진 Key와 동등한 Key가 있으면 그 Map.Entry를 리턴 없으면 다음으로 작은 Map.Entry를 리턴 |
ceilingEntry(Key) | Map.Entry<k,v> | 주어진 Key와 동등한 Key가 있으면 그 Map.Entry를 리턴 없으면 다음으로 큰 Map.Entry를 리턴 |
pollFirstEntry() | Map.Entry<k,v> | 가장 작은 Map.Entry를 반환하고 TreeMap에서 삭제 |
pollLastEntry() | Map.Entry<k,v> | 가장 큰 Map.Entry를 반환하고 TreeMap에서 삭제 |
descendingKeySet() | NavigableSet<E> | 내림차순으로 정렬된 Key의 NavigableSet를 반환 |
descendingMap() | NavigableMap<K,V> | 내림차순으로 정렬된 Map.Entry의 NavigableMap을 반환 |
headMap(Key, boolean inclusive) | NavigableMap<K,V> | 주어진 Key보다 작은 Map.Entry를 NavigableMap으로 반환 inclusive가 true이면 obj도 포함 |
tailMap(Key, boolean inclusive) | NavigableMap<K,V> | Key보다 큰 객체를 NavigableMap으로 반환 inclusive가 true이면 obj도 포함 |
subMap(key1, boolean inclusive1, key2, boolean inclusive2) |
NavigableMap<K,V> | key1보다 크고 key2보다 작은 객체를 NavigableMap으로 반환 inclusive가 true이면 obj도 포함 |
Stack 스택
후입선출 LIFO 의 자료구조를 구현한 클래스
메소드 | Return | 설명 |
push(Object obj) | boolean | obj를 스택에 저장 |
peek() | Object | 가장 나중에 저장된 객체를 반환 |
pop() | Object | 가장 나중에 저장된 객체를 반환 후 Stack에서 제거 |
Queue 큐
선입선출 FIFO의 자료구조를 구현한 인터페이스
Queue를 구현한 대표적인 클래스는 LinkedList이다.
메소드 | Return | 설명 |
offer(Object obj) | boolean | obj를 큐에 저장 |
peek() | Object | 가장 먼저에 저장된 객체를 반환 |
pop() | Object | 가장 먼저에 저장된 객체를 반환 후 큐에서 제거 |
Queue<E> queue = new LinkedList<E>();
출처
신용권, 이것이 자바다, 한빛미디어
https://en.wikipedia.org/wiki/Linked_list
https://www.geeksforgeeks.org/swapping-items-list-java-collections-swap/
https://www.geeksforgeeks.org/java-util-collections-rotate-method-java-examples/
'JAVA > JAVA' 카테고리의 다른 글
Comparator와 Comparable (0) | 2021.10.29 |
---|---|
Lambda Expressions 람다식 (0) | 2021.10.28 |
제어문(조건문 if, 반복문 for/while) (0) | 2021.10.07 |
연산자 Operator (0) | 2021.10.04 |
JVM 자바 가상머신 (0) | 2021.10.02 |