[JAVA] Java HashMap, LinkedHashMap, TreeMap

2023. 2. 16. 10:09Java

Map

key와 value로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조


HashMap

  • Map 인터페이스를 상속하여 Map의 성질을 그대로 가지고 있음
  • 많은 양의 데이터를 검색하는데 뛰어난 성능을 보임
  • key, value를 넣은 순서와 상관없이 들어감

 

1. HashMap Initializing

1) Static HashMap 초기화 - Map이 가변적일 때

static으로 정의된 map이 변하기 쉬울 때 사용한다. 자유롭게 각 Key value를 추가하거나 삭제할 수 있다.

public static Map<String, String> mapFruit;
static {
    mapFruit = new HashMap<>();
    mapFruit.put("A", "apple");
    mapFruit.put("B", "Banana");
}
Map<String, String> doubleBraceMap  = new HashMap<String, String>() {{
    put("key1", "value1");
    put("key2", "value2");
}};

이런 식으로 초기화할 수도 있지만 사용할 때마다 추가 클래스를 생성하는 등 메모리 누수 문제를 일으킬 수 있으므로 지양해야한다.

 

2) Java Collections로 초기화 - Map이 변하지 않을 때

map이 변하지 않을 때 사용한다. 만약 더 추가하려고 하면, 'java.lang.UnsupportedOperationException' 이 발생한다.

public static Map<String, String> createSingletonMap() {
    return Collections.singletonMap("username1", "password1");
}

Collection의 emptyMap을 사용하여 빈 Map을 만들 수 있다.

Map<String, String> emptyMap = Collections.emptyMap();

 

3) HashMap 선언 방법들 

HashMap은 저장공간을 초과한 값이 들어오면 List처럼 저장공간을 늘리는데, 약 두 배로 늘리면서 과부하가 발생한다.

그러므로 초기에 Map의 용량을 지정해주는 것이 좋다.

HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
    put("a","b");
}};

https://d2.naver.com/helloworld/831311

 

2. HashMap Initializing - JAVA9

더보기

1) Map.of()

빈 Map, key-value가 한 쌍인 Map, 최대 10개의 key-value를 가진 Map 모두 만들 수 있다.

Map<String, String> emptyMap = Map.of();
Map<String, String> singletonMap = Map.of("a", "apple");
Map<String, String> map = Map.of("a","apple", "b", "banana");

2) Map.ofEntries()

불가변적인 map에만 지원된다. 가변적인 map에 사용할 경우, UnsupportedOpertaionException을 낸다.

key는 유일해야하고 null값이 들어가면 안된다.

Map<String, String> map = Map.ofEntries(
  new AbstractMap.SimpleEntry<String, String>("name", "John"),
  new AbstractMap.SimpleEntry<String, String>("city", "budapest"),
  new AbstractMap.SimpleEntry<String, String>("zip", "000000"),
  new AbstractMap.SimpleEntry<String, String>("home", "1231231231")
);

 

3. 값 추가하기 put

HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");
map.put(1,"딸기"); //값 변경

4. 값 삭제하기 remove, clear

map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거

5. 값 가져오기 get

# map 전체

map; //{1=사과, 2=바나나, 3=포도}

# key값으로 가져오기

map.get(1); //사과

# entrySet

key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 keySet()보다 entrySet()이 좋다.

for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[key]:" + entry.getKey() + " [value]:" + entry.getValue());
}

//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

# keySet

for(Integer i : map.keySet()){
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

 6. forEach (람다)

코드라인이 줄어들어 가독성이 좋지만, for문보다 속도가 느리고 병렬처리로 CPU의 점유율이 올라갈 수 있다는 단점이 있다.

map.forEach((key, value) -> System.out.println(key + "=>" + map.get(key)));

// 1=>사과
// 2=>바나나
// 3=>포도

https://needjarvis.tistory.com/636

7. 특정 key가 존재하는지 확인 containsKey

key가 있으면 true, 없으면 false를 return한다.

map.containsKey("a") // fasle
map.containsKey(3) //true

8. 특정 value가 존재하는지 확인 containsValue

value가 있으면 true, 없으면 false를 return한다.

map.containsValue("체리") // false
map.containsValue("바나나")// true

9. key의 개수 구하기

map.size();

List<HashMap>

HashMap 배열 형태

1. 선언하기

List<HashMap<String,Object>> = new ArrayList<HashMap<String,Object>>();

LinkedHashMap

HashMap과 달리 key, value를 넣은 순서대로 들어감

TreeMap

들어간 key를 기준으로 이진트리구조를 사용하여 자동정렬

 

참고

728x90

'Java' 카테고리의 다른 글

[Java] LocalDate 비교  (0) 2023.08.10
[JAVA] HashMap, LinkedHashMap - value로 key찾기  (0) 2023.08.09
[JAVA] Set과 Map의 차이  (0) 2023.07.27
[JAVA] 자바 TreeMap 사용하기  (0) 2023.02.16
[JAVA] 변수형 타입 변환하기  (0) 2022.12.06