Java

[Java] HashMap

lala9663 2022. 11. 23. 15:51

HashMap

HashMap은 Map 인터페이스에 속해있는 컬렉션이다.
Map 인터페이스의 기본 기능들을 전부 구현할 수 있다.
데이터들은 모두 (키, 값)의 1:1 구조로 되어있는 Entry로 되어있다.

 

 

같은 키의 값을 삽입하려고하면 해당 키의 값이 변경된다.
키는 고유한 속성이지만 값은 고유한 속성이 아니다.
키는 중복이 되지 않지만 값은 중복될 수 있다.
다른 특징은 HashTable과 유사하지만 동기화가 되지 않고 Null 값도 저장이 가능하다.

 


HashMap 선언 및 사용

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args)  {
        HashMap hm = new HashMap(); // 타입 설정x Object 입력
        HashMap<Integer, Integer> i = new HashMap<>(); // Integer, Integer 타입 설정
        HashMap<Integer, Integer> i2 = new HashMap<>(i); // i의 값을 i2에 카피
        HashMap<Integer, Integer> i3 = new HashMap<>(10); // 초기용량 지정
        HashMap<Integer, Integer> i4 = new HashMap<>() {{ // 변수 선언 + 초기값 지정
            put(1, 100);
            put(2, 200);
        }};        

        HashMap<String, String> str = new HashMap<String, String>(); // String, String 타입 설정
        HashMap<Character, Character> ch = new HashMap<Character, Character>(); // Char, Char 타입 설정
    }
}

HashMap을 선언하는 방법은 여러가지이다.
HashMap은 Key, Value 2개의 값을 가지고 있으므로 타입을 선언하려면 두 개의 타입을 선언해야 한다.
HashMap <타입, 타입> 변수명 = new HashMap <타입, 타입>();으로 선언한다.
HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 생성자를 초출하면 된다. HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 List처럼 저장공간을 한 칸씩 늘리지 않고 약 2배로 늘린다. 여기서 과부하가 많이 발생한다.
그렇기에 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해주는 것이 좋다.

 


HashMap 값 추가

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args)  {
        HashMap<String, String> hm = new HashMap<String, String>(); // HashMap 선언

        // 값 추가
        hm.put("1", "Hello1");
        hm.put("2", "World2");
        hm.put("3", "Hello3");
        hm.put("4", "World4");
        hm.put("2", "WorldWorld2");

        System.out.print(hm); // 결과 출력
    }
}

HashMap의 값을 추가는 put을 사용한다.
들어가는 타입은 변수를 선언할 당시의 타입으로 맞춰서 입력해야 한다.
만약 같은 키 값의 데이터를 put 하면 기존의 Value가 나중에 넣은 Value로 변경된다.

결과

{1=Hello1, 2=Worldworld2, 3=Hello3, 4=World4}

HashMap 값 삭제

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args)  {
        HashMap<String, String> hm = new HashMap<String, String>(); // HashMap 선언

        // 값 추가
        hm.put("1", "Hello1");
        hm.put("2", "World2");
        hm.put("3", "Hello3");
        hm.put("4", "World4");

        System.out.println(hm); // 결과 출력

        hm.remove("3");
        System.out.println(hm); // 결과 출력

        hm.clear();
        System.out.println(hm); // 결과 출력
    }
}

HashMap의 값을 삭제는 remove(key) 메서드를 사용한다.
모든 값을 제거하려면 clear() 메소드를 사용하면 된다.

결과

{1=Hello1, 2=World2, 3=Hello3, 4=World4}
{1=Hello1, 2=World2, 4=World4}
{}

HashMap 값 출력

향상된 for문 사용

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};

System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));//key값 1의 value얻기 : 사과

//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()){ //저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap을 출력하는 방법에는 다양한 방법이 있다. 그냥 print 하게 되면 {}로 묶어 Map의 전체 key값, value가 출력된다. 특정 key값의 value를 가져오고 싶다면 get(key)메소드를 사용하면 되고 전체를 출력하려면 entrySet() 이나 keySet()메소드를 활용하여 Map의 객체를 반환받은 후 출력하면 된다. entrySet()은 key와 value 모두가 필요할 경우 사용하며 keySet()은 key 값만 필요할 경우 사용하는데 key값만 받아서 get(key)를 활용하여 value도 출력할 수도 있기에 어떤 메소드를 선택하든지 간에 큰 상관이 없어 대부분 코드가 간단한 keySet을 활용하시던데 key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋습니다.

 

 

Iterator 사용

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};

//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" +  entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap의 전체 출력 시 반복문을 사용하지 않고 Iterator를 사용해도 된다. Iterator로 Map안의 전체 요소를 출력하는 방법이다.

 

 

 

 

 

출처: https://coding-factory.tistory.com/556