본문 바로가기

백엔드/JAVA

[JAVA] HashMap LinkedHashMap 차이점

데이터를 모아서 관리할 수 있는 클래스를 컬렉션이라고 한다.

컬렉션은 그 타입에 따라 내부에 데이터를 저장하는 구조와 처리하는 방법이 다르다. 내부에서 처리하는 방법에 따라 데이터의 탐색이 빠른 경우가 있고, 추가/제거가 빠른 경우가 있다. 사용하는 컬렉션의 특성을 잘 알고 사용해야 불필요한 성능 저하를 피할 수 있다. (즉 상황에 맞는 형태의 자료구조를 써야한다!)

 

 

 

자바에서 제공하는 컬렉션의 대표적인 예로 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