[JAVA] 컬렉션(Collection)
1. List
-
List
인터페이스 - 순서가 있는 데이터 집합
- 데이터(value) 중복 O
- 인덱스를 통해 랜덤 액세스(Random Access) 가능
O(1)
-
삽입/삭제시 데이터를 옮겨야 해서 비효율적이다
O(N)
- 구현체 :
ArrayList
,LinkedList
,Vector
(동기화 지원, 구버전으로 사용 X)
ArrayList<String> list = new ArrayList<String>();
- Vector vs ArrayList
- ArrayList : 동기화가 안되는 클래스(동시에 여러 쓰레드가 접근 가능), 싱글 쓰레드 환경에서 더 빠름
- Vector : 동기화를 지원하는 클래스(한 번에 하나의 쓰레드만 접근 가능)
2. Set
-
Set
인터페이스 -
순서가 없는 데이터 집합으로 데이터 중복이 불가
- 구현체 :
HashSet
,LinkedHashSet
(순서),TreeSet
(정렬)-
TreeSet
:Comparable
구현 orComparator
제공 해야 정렬 가능
-
HashSet<String> set = new HashSet<String>();
- 데이터 중복여부를
hashCode()
와equals()
로 확인 (링크)- class를 정의할 때 동등객체로 적용하고 싶으면 hashCode()와 equals()을 오버라이딩 해야 한다
- 동등객체 : hashCode()와 equals() 모두 true일 때
- HashSet : equals(), hashCode() 비교해서 중복여부 확인
- TreeSet : equals(), hashCode() 비교 + Comparable 구현여부 확인(정렬)
3. Map
-
Map
인터페이스 - 순서가 없는 key-value 쌍의 데이터 집합
-
key값은 중복 불가, 데이터는 중복 가능
- 구현체 :
HashMap
,LinkedHashMap
(순서),TreeMap
(정렬),HashTable
(동기화 지원, 구버전으로 사용 X)-
HashMap
:Entry[]
로 관리, 배열의 index는 key값의 해시값으로 결정 -
LinkedHashMap
: 링크드리스트로 구현되어 있어 순서 보장 -
TreeMap
: R-B트리로 관리되어 항상 정렬되어 있음, key값을 기준으로 정렬,NavigableMap
구현
-
HashMap<Integer, String> map = new HashMap<Integer, String>();
- HashTable vs HashMap
- HashMap : 동기화가 안되는 클래스(동시에 여러 쓰레드가 접근 가능), 싱글 쓰레드 환경에서 더 빠름
- HashTable : 동기화를 지원하는 클래스(한 번에 하나의 쓰레드만 접근 가능), 단 5버전 이상부터 지원하는
CurrentHashMap
을 사용하는 것이 좋다
메서드
public interface Map<K, V> {
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
interface Entry<K, V> {
K getKey();
V getValue();
...
}
}
- 한개의 값
-
Map.Entry
인터페이스의getKey()
,getValue()
-
Map.Entry
인터페이스 : Key-Value 쌍을 다루기 위한 인터페이스, Map인터페이스 내부에 정의
-
- 모든 값
- Key :
keySet()
(return : Set) - Values :
values()
(return : Collection) - Key-Value 쌍 :
entrySet()
(return : Set)
- Key :
Properties
-
HashTable
의 하위 클래스 - key와 value 자료형이 모두 String
- txt, xml파일에 Properties 객체를 추가할 수 있는 기능
4. Stack과 Queue
Stack (클래스)
-
Vector
의 하위클래스 (List) -
push()
: 저장,pop()
: 꺼내오면서 제거,peek()
: 조회
Queue (인터페이스)
-
Collection
의 하위 인터페이스 -
offer()
: 저장,poll()
: 꺼내오면서 제거,peek()
: 조회
자바 인터페이스
1. Comparable
public interface Comparable<T> {
public int compareTo(T o);
}
- 클래스의 기본 정렬 방식을 지정할 때 사용 (기본값 : 오름차순)
- compareTo(Object)에 정렬방식을 구현
- Comparable 인터페이스를 구현한 클래스는 정렬이 가능함
- 사용자정의 클래스에서 Collections.sort()를 사용하기 위해서는 반드시 Comparable 인터페이스를 구현해야 한다
2. Comparator
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
...
- 기본 정렬 방식을 변경할 때 사용
-
compare(Object o1, Object o2)
를 구현
-
ex) String
클래스에서 compareTo()가 final로 정의되어 있기 떄문에 Comparator를 사용한다
static void sort(Object a) // 지정된 Comparable에 의한 정렬
static void sort(Object a, Comparator c) // 수정된 Comparator에 의한 정렬
3. Iterator
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
- 컬렉션 프레임워크에서 사용하는 방법
- Collection 인터페이스에 iterator() 정의
- List 와 Set 인터페이스에 iterator() 오버라이딩
ex) Map에서 사용하기 위해서는 Key, Entry->Set, Value->Collection으로 변환한 후 iterator()을 호출해야함.
[Map -> Set(Key or Entry의 경우) : keySet() or entrySet() / Map -> Collection(Value의 경우) : values() 사용해 변환]
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("나자바", 85); map.put("홍길동", 90);
map.put("동장군", 80); map.put("홍길동", 95);
// keySet()
Set<String> keySet = map.keySet();
Iterator<String> keyIterator = keySet.iterator();
while (keyIterator.hasNext()) {
String key = keyIterator.next();
Integer value = map.get(key);
System.out.println(key + " : " + value);
}
System.out.println();
// entrySet()
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()) {
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " : " + value);
}
// values()
Collection<Integer> c = map.values();
Iterator<Integer> valueIterator = c.iterator();
while (valueIterator.hasNext()) {
Integer value = valueIterator.next();
System.out.println(value);
}
}
}
// keySet()
나자바 : 85
홍길동 : 95
동장군 : 80
// entrySet()
나자바 : 85
홍길동 : 95
동장군 : 80
// values()
85
95
80