JAVA/JAVA

Collection 컬렉션

호두밥 2021. 10. 25. 09:56

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보다 느리다.

https://en.wikipedia.org/wiki/Linked_list

 

 

삭제와 삽입이 자주 일어나는 경우에는 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/

Oracle, The JAVA™ Tutorials, Java Documentation

https://www.javatpoint.com/collections-in-java

'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