MyCloud

JAVA의 HashMap, HashTable 본문

Programming/Data Structure

JAVA의 HashMap, HashTable

Swalloow 2016. 3. 20. 10:55



Map - HashTable, HashMap


자바 컬렉션에서 제공하는 Map 인터페이스는 키(key)와 값(value)을 묶어서 하나의 데이터로 저장하는 구조입니다.

Set 구조와 달리 중복을 허용하는 특징이 있습니다.

키(key)의 경우에는 유일해야 하지만 값(value)은 데이터의 중복을 허용합니다.

HashMap은 내부적으로 해싱(Hashing)을 이용해서 구현한 컬렉션이기 때문에

많은 양의 데이터를 검색하는데 있어 뛰어난 성능을 보입니다.


HashTable 또한 Map 인터페이스를 구현한 구조입니다.

하지만 1.2 버전 이후부터 HashMap이 나오면서 

HashTable에 비해 다양한 함수를 제공하는 HashMap으로 대체되었습니다.

HashTable과 HashMap의 차이는 null 값을 허용하는데에 있습니다.

HashTable은 null 값을 허용하지 않지만, HashMap은 null 값을 허용합니다.


+ 추가

HashMap API 문서에 따르면, "This implementation is not synchronized" 라고 명시되어 있습니다.

따라서, 멀티쓰레드를 사용하는 경우에는 Collections.synchronizedMap 으로 매핑시켜 주어야 합니다.

Map m = Collections.synchronizedMap( new HashMap( . . . ));

즉, HashMap은 쓰레드에 의한 문제를 배제하기 때문에 critical section을 생성할 필요가 없습니다.

이를 통해 만일 쓰레드를 사용하는 경우가 아니라면 

HashMap의 성능이 HashTable 보다 훨씬 뛰어나다는 것을 알 수 있습니다.

 








JAVA의 HashMap 구현


HashMap의 위와 같은 특징 때문에 관계형 데이터베이스(RDBMS)와 유사한 모습을 가지고 있습니다.

우선 주요 메서드와 사용법을 알아보겠습니다.



 Method

 Description 

 void clear()

 HashMap에 저장된 모든 객체를 제거

 Set entrySet()

 HashMap에 저장된 키와 값을 결합된 형태로 저장 후 반환

 Object get(key)

 지정된 키의 객체를 반환

 Set keySet()

 HashMap에 저장된 모든 키의 Set을 반환

 Object put(key, value)

 지정된 키와 값을 HashMap에 저장

 Object remove(key)

 HashMap에서 지정된 키로 저장된 값을 제거

 int size()

 HashMap에 저장된 요소의 개수를 반환

 Collection values()

 HashMap에 저장된 모든 값을 컬렉션의 형태로 반환


[참고 : http://docs.oracle.com/javase/8/docs/api/index.html]



이제 HashMap을 이용한 코드를 통해 어떻게 적용하는지 알아보겠습니다.

아래는 대학교에 다니는 학생들을 저장하는 collection 구조입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Student {
    private String name;
    private String grade;
    private String major;
    
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getGrade() {return grade;}
    public void setGrade(String grade) {this.grade = grade;}
    public String getMajor() {return major;}
    public void setMajor(String major) {this.major = major;}
    
    public Student(String name, String grade, String major) {
        this.name = name;
        this.grade = grade;
        this.major = major;
    }
}
cs


학생은 이름, 학년, 전공 값을 가지며 중복이 가능합니다. (동명이인, 동기...)

대부분 대학교는 학번으로 학생을 구분하기 때문에 키(key)는 학번이 됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class CHashMap {
    static HashMap<Integer, Student> student = new HashMap<Integer, Student>();
    
    public static void main(String[] args) {
        student.put(1111new Student("김예시""3학년""영문과"));
        student.put(2222new Student("정예시""1학년""영문과"));
        student.put(3333new Student("김예시""2학년""컴공과"));
        student.put(4444new Student("이예시""4학년""중문과"));
        student.put(5555new Student("문예시""4학년""의예과"));
        
        printKey();
        printValue();
        printAll();
    }
    
    static public void printKey() {
        System.out.println("this is key----------");
        for(int key : student.keySet()) {
            System.out.println(key);
        }
    }
    
    static public void printValue() {
        System.out.println("this is value----------");
        for(Student student : student.values()) {
            System.out.println(student.getName()+" "+student.getGrade()+" "+student.getMajor());
        }
    }
    
    static public void printAll() {
        System.out.println("this is all----------");
        for(int key : student.keySet()) {
            System.out.println(key+" "+student.get(key).getName()+" "+student.get(key).getGrade()+" "+student.get(key).getMajor());
        }
    }
}
cs


먼저 put 함수를 이용하여 키(key)와 값(value)을 저장했습니다.

그리고 키를 출력하는 함수, 값을 출력하는 함수, 키와 값을 함께 출력하는 함수를 만들었습니다.

위와 같이 keySet() 함수를 사용해도 되고 values() 함수를 사용해도 됩니다.

예시에는 안나와 있지만 entrySet() 함수를 사용해도 되기 때문에 상황에 맞게 편한대로 !



 Key

 Value(name)

 Value(grade)

 Value(major)

 5555

 문예시

 4학년

 의예과

 3333

 김예시

 2학년

 컴공과

 1111

 예시

 3학년

 영문과 

 4444

 예시

 4학년

 중문과

 2222

 예시

 1학년

 중문과



결과는 위와 같이 출력되며, 값에 대한 중복을 허용하는 것을 확인할 수 있습니다.



+ 추가

HashMap API 문서에 따르면, HashMap은 해당 map의 순서를 보장하지 않는다고 명시되어 있습니다.

따라서 출력결과가 HashMap에 넣은 순서와 관계없이 출력된 것입니다.

하지만, LinkedHashMap 클래스를 사용하면 삽입된 순서대로 반복문을 수행하도록 할 수 있다고 합니다.



'Programming > Data Structure' 카테고리의 다른 글

JAVA의 HashSet, TreeSet  (0) 2016.03.13
JAVA의 BinarySearchTree  (3) 2016.03.13
JAVA의 BinaryTree  (0) 2016.03.13
JAVA의 Tree  (1) 2016.03.13
JAVA의 Queue  (0) 2016.03.11
Comments