[기본 개념] 6 | (1.9) HashMap, Hashtable

728x90

[기본 개념] 6 | (1.9) HashMap, Hashtable

1 컬렉션 프레임웍의 핵심 인터페이스

2 ArrayList

3 LinkedList

4 Stack과 Queue

5 Iterator, Listlterator, Enumeration

6 Arrays

7 Comparator와 Comparable

8 HashSet

9 TreeSet

10> HashMap과 Hashtable

11 TreeMap

12 Properties

13 Collections

14 컬렉션 클래스 정리 & 요약

10. HashMap과 Hashtable

 HashMap은 Hashtable의 새로운 버전이다. 따라서 HashMap을 사용하는 것을 지향한다.

 

 HashMap은 Map을 구현했으므로 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다. 그리고 해싱(hashing)을 사용하여 많은 양의 데이터를 검색하는데 성능이 좋다.

 

 HashMap은 Entry라는 내부 클래스를 정의하고, 다시 Entry타입의 배열을 선언하며 키와 값을 각각 Object타입으로 저장한다. 키는 주로 String을 대문자나 소문자로 통일해서 사용한다.

 

키(key)          컬렉션 내의 키(key)중에서 유일해야 한다.

값(value)      데이터의 중복을 허용

 

예제/HashMapEx1.java

import java.util.*;

public class HashMapEx1 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("myId", "1234");
        map.put("asdf", "1111");
        map.put("asdf", "1234");

        Scanner s = new Scanner(System.in);

        while (true) {
            System.out.println("id와 password를 입력해주세요");
            System.out.print("id : ");
            String id = s.nextLine().trim();

            System.out.print("password : ");
            String password = s.nextLine().trim();
            System.out.println();

            if (!map.containsKey(id)) {
                System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");

                continue;
            } else {
                if (!map.get(id).equals(password)) {
                    System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
                } else {
                    System.out.println("id와 비밀번호가 일치합니다.");
                    break;                    
                }
            }
        }
    }
}
실행결과

id와 password를 입력해주세요
id : asdf
password : 1111

비밀번호가 일치하지 않습니다. 다시 입력해주세요.
id와 password를 입력해주세요
id : asdf
password : 1234

id와 비밀번호가 일치합니다.

 

 HashMap을 생성하고 사용자 ID와 비밀번호를 키와 값의 쌍으로 저장한 다음, 입력된 사용자 ID를 HashMap에서 검색해서 얻은 값을 입력된 비밀번호와 비교하는 예제이다. 

 

 이때, 세 번째로 저장한 데이터의 키인 'asdf'는 이미 존재하기 때문에 추가되지 않고 기존의 값을 덮어썼다. 따라서 키 'asdf'에 연결된 값은 '1234'가 된다.

 

예제/HashMapEx4.java

import java.util.*;

public class HashMapEx4 {
    public static void main(String[] args) {
        String[] data = {"A", "K", "K", "A", "K", "D", "K", "A", "Z", "K", "D", "K"};

        HashMap map = new HashMap();

        for (int i = 0; i < data.length; i++) {
            if (map.containsKey(data[i])) {
                Integer value = (Integer)map.get(data[i]);
                map.put(data[i], new Integer(value.intValue() + 1));
            } else {
                map.put(data[i], new Integer(1));
            }
        }

        Iterator it = map.entrySet().iterator();

        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            int value = ((Integer)entry.getValue()).intValue();
            System.out.println(entry.getKey() +  " : " + printBar('#', value) + " " + value);
        }
    }

    public static String printBar(char ch, int value) {
        char[] bar = new char[value];

        for (int i = 0; i < bar.length; i++)
            bar[i] = ch;

        return new String(bar);     // String(char[] chArr)
    }
}
실행결과

A : ### 3
D : ## 2
Z : # 1
K : ###### 6

 

 문자열 배열에 담긴 문자열을 하나씩 읽어서 HashMap에 키로 저장하고 값으로 1을 저장한다. HashMap에 같은 문자열이 키로 저장되어 있는지 containKey( )로 확인하여 이미 저장되어 있는 문자열이면 값을 1 증가시켜서 그 결과를 printBar( )를 이용해서 그래프로 표현했다.

 

해싱과 해시함수

 해싱이란 해시함수를 이용해서 데이터를 해스테이블에 저장하고 검색하는 기능이다. 이는 다량의 데이터중에서 원하는 데이터를 빠르게 찾을 수 있다.

 

1 검색하고자 하는 값의 키로 해시함수를 호출한다.

2 해시함수의 계산결과(해시코드)로 해당 값이 저장되어 있는 링크드 리스트를 찾는다.

3 링크드 리스트에서 검색한 키와 일치하는 데이터를 찾는다.

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90