HashTable이란?


HashMap과 동일한 내부구조를 가지고 있는 Map 구현 클래스



HashMap vs HashTable


 

HashMap 

HashTable 

 동일한 키 기준

 hashCode( )와 equals( ) 

 hashCode( )와 equals( ) 

 동기화된 메소드

 없음

 동기화된 메소드로 구성


HashMap과 HashTable은 동일한 내부 구조를 가지고 있지만

HashTable의 경우는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가

동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드가 실행가능하다.

이는 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다는 것을 의미한다.



Properties란?


Hashtable의 하위 클래스로 Hashtable의 모든 특징을 가지고 있다.

차이점은 Properties는 키와 값을 String으로 제한하였다는 것이다.


주로 애플리케이션의 옵션 정보, 데이터베이스 연결정보 그리고 국제화 정보가 저장된

프로퍼티(~.properties) 파일을 읽을 때 주로 사용




'자료구조' 카테고리의 다른 글

[그래프] 깊이 우선 탐색(DFS)  (0) 2017.03.10
[Map] HashMap  (0) 2017.03.10
[Set]HashSet의 특징  (1) 2017.03.09
[그래프]넓이 우선 탐색(BFS)  (0) 2017.03.07
[그래프] 인접리스트와 인접행렬을 이용한 구현  (0) 2017.02.26

HashMap이란?


Map 인터페이스를 구현한 대표적인 Map 컬렉션



Map이란?


Key와 value으로 구성된 Entry 객체를 저장하는 구조를 가짐(key, value 모두 객체)

키는 중복 저장될 수 없지만 값은 중복 저장 가능

HashMap, HashTable, LinkedHashMap, Properties, TreeMap 등이 있다.



HashMap 특징


HashSet과 마찬가지로 hashcode()와 equals()로 동일한 키 여부를 결정한다.





기본 사용법 코드


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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package map.hashmap;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
public class HashMapExample1 {
    public static void main(String[] args) {
        
        //Map 생성
        Map<String, Integer> map = new HashMap();
        
        
        //객체 저장
        map.put("원빈"50);
        map.put("장동건"70);
        map.put("하하"40);
        
        System.out.println("총 Entity 수 : " + map.size());
        
        //객체 찾기
        System.out.println("하하 : " + map.get("하하"));
        System.out.println();
        
        //하나씩 처리 - ketset()이용
        Set<String> keySet = map.keySet();
        Iterator<String> keyIterator = keySet.iterator();
        while(keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
            System.out.println(key + " : " + value );
        }
        System.out.println();
        
        //객체 삭제
        map.remove("장동건");
        System.out.println("총 Entry 수 : " + map.size());
        
        //하나씩 처리 - entryset() 이용
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
        
        while(entryIterator.hasNext()) {
            Map.Entry<String, Integer> entry = entryIterator.next();
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + " : " + value );
        }
        System.out.println();
        
        //객체 전체 삭제
        map.clear();
        System.out.println("총 Entry 수 : " + map.size());
    }
}
 
cs



hashcode( )와 eqauls( ) 재정의를 통한 동일한 키 삽입 예제 코드


키로 사용할 객체(hashcode() eqauls() 재정의)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Member {
    private String name;
    private int age;
    
    /*
        get, set 메소드 생략
    */
 
    @Override
    public int hashCode() {
        return name.hashCode() + age; //이름과 나이가 같으면 동일한 해쉬코드
    }
 
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member) obj;
            return member.getName().equals(name) && (member.getAge() == age); //이름과 나이가 같으면 true
        } else {
            return false;
        }
    }
}
cs



이름과 나이가 같은 경우 동일한 키로 판단


1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.HashMap;
import java.util.Map;
import set.hashset.Member;
 
public class HashMapExample2 {
    public static void main(String[] args) {
        Map<Member, String> map = new HashMap();
        map.put(new Member("명수"30), "골드"); //이름과 나이가 같은 Member 키로 저장
        map.put(new Member("명수"30), "골드");
        
        System.out.println("총 Entry 수 : " + map.size()); //1개만 저장된다.
    }
}
cs


HashSet


Set 인터페이스의 구현 클래스

HashSet은 객체들을 순서없이 저장하고 동일한 객체를 중복 저장하지 않는다.



HashSet의 가장 큰 특징


HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지 않는다.

HashSet은 객체를 저장하기전 먼저 객체의 hashCode() 메서드를 호출하여 해시코드를 얻고

이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해쉬코드가 있다면 다시 equals() 메소드로

두 객체를 비교해 참이면 동일한 객체로 저장하고 중복 저장하지 않는다.




예시 코드


Member 클래스


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
37
38
39
40
41
42
public class Member {
    private String name;
    private int age;
    
    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    //hashCode()와 eqauls() 재정의    
    
    @Override
    public int hashCode() {  
        return name.hashCode() + age;  //name과 age가 같으면 동일한 hashcode 리턴
    }
 
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member) obj;
            return member.getName().equals(name) && (member.getAge() == age); //name과 age가 같으면 true
        } else {
            return false;
        }
    }
}
cs



HashSet을 이용한 동일한 데이터를 가진 객체 저장


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.HashSet;
import java.util.Set;
 
public class HashSetExample {
    public static void main(String[] args) {
        Set<Member> set = new HashSet();
        
        set.add(new Member("홍길동"30));
        set.add(new Member("홍길동"30));
        //인스턴스는 다르지만 내부 데이터는 동일한 Memeber 인스턴스 2개
        //2개를 모두다 넣지만 하나만 저장된다. (hashcode값이 같고, eqauls() true가 리턴되기에)
        
        System.out.println("총 객체 수 : " + set.size()); // 총 객체 수 : 1    출력
    }
}
cs


+ Recent posts