데이터를 모아서 관리할 수 있는 클래스를 컬렉션이라고 한다.
컬렉션은 그 타입에 따라 내부에 데이터를 저장하는 구조와 처리하는 방법이 다르다. 내부에서 처리하는 방법에 따라 데이터의 탐색이 빠른 경우가 있고, 추가/제거가 빠른 경우가 있다. 사용하는 컬렉션의 특성을 잘 알고 사용해야 불필요한 성능 저하를 피할 수 있다. (즉 상황에 맞는 형태의 자료구조를 써야한다!)
자바에서 제공하는 컬렉션의 대표적인 예로 List, Map, Set 등이 있다. 그 중 내가 이번에 정리할것은 Map은 Key 값과 Value 값을 관리해주는 컬렉션이다. Key - Value 쌍은 java.util.Map.Entry 클래스로 정의되며 이 Entry 들을 저장, 관리 해주는 컬렉션이 Map이다
HashMap과 LinkedHashMap 두가지의 내부 구현방식을 비교 정리해 보려 한다!
HashMap
- HashMap은 Map 인터페이스의 한 종류로 Key와 Value 한 쌍을 데이터로 가지고 있으며 Key를 통해 Value에
접근할 수 있다. (JS에서 {}와 비슷한 역할을 한다. 즉, 객체를 담아두기 편리한 형태!)
- HashMap은 그 안에 들어있는 데이터를 Set 구조(key,value)로 저장하기 때문에
Set의 원칙대로 중복된 데이터를 허락하지 않으며 순서가 없다. (= 데이터가 순서대로 저장되지 않음)
- hashing을 사용하기 때문에 많은양의 데이터를 검색하는데 뛰어난 성능을 가지고 있다.
LinkedHashMap
- 데이터의 입력된 순서를 기억한다 (FIFO 구조)
- p.Entry 클래스를 구현한 Node 클래스로 내부에 before, after 멤버를 갖는 연결리스트 구조를 가지고 있다
- HashMap의 모든 기능을 그대로 사용할 수 있다.
- 순서를 유지하기 때문에 메모리 사용량이 HashMap보다 높다.
HashMap과 LinkedHashMap 출력 예시
package iterator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class Map_Example {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
Map<String, String> linkedMap = new LinkedHashMap<String, String>();
map.put("key0", "1");
map.put("key1", "2");
map.put("key2", "3");
map.put("key3", "4");
map.put("key4", "5");
map.put("key5", "6");
map.put("key6", "7");
map.put("key7", "8");
map.put("key8", "9");
map.put("key9", "10");
linkedMap.put("key0", "1");
linkedMap.put("key1", "2");
linkedMap.put("key2", "3");
linkedMap.put("key3", "4");
linkedMap.put("key4", "5");
linkedMap.put("key5", "6");
linkedMap.put("key6", "7");
linkedMap.put("key7", "8");
linkedMap.put("key8", "9");
linkedMap.put("key9", "10");
Set<String> set = map.keySet();
Set<String> linkedSet = linkedMap.keySet();
Iterator<String> iter = set.iterator();
Iterator<String> linkedIter = linkedSet.iterator();
System.out.println("[HashMap 출력결과]");
for (int i = 0; i < 10; i++) {
System.out.println( map.get(iter.next()) );
}
System.out.println("\n");
System.out.println("[LinkedHashMap 출력결과]");
for (int i = 0; i < 10; i++) {
System.out.println( linkedMap.get(linkedIter.next()) );
}
}
}
출력결과 >>
[HashMap 출력결과]
5
4
7
6
1
3
2
9
8
10
[LinkedHashMap 출력결과]
1
2
3
4
5
6
7
8
9
10
'과거의 이력 > JAVA' 카테고리의 다른 글
[Spring] Dispatcher-Servlet (0) | 2022.09.07 |
---|---|
[Java] Java 길이 확인하기 (length, length(), size() 차이) (0) | 2022.08.17 |
[error] 자바 Required String parameter is not present 에러 원인 (0) | 2022.07.14 |
[JAVA] 변수 타입 확인하기 (0) | 2022.07.12 |
[Servlet] HTTP 세션 상태관리 (0) | 2022.07.08 |