본문 바로가기
DEV/Java

[자바] HashMap

by 어쩌다개발 2023. 2. 15.
반응형

HashMap은 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다.
그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.

public class HashMap extends AbstractMap implements Map, Cloeable, Serializable {
	transient Entry[] table;
    	...
    static class Entry implements Map.Entry {
    	final Object key;
        Object value;
        ...
    }
}

HashMap은 Entry 라는 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언하고 있다.
키와 값은 별개의 값이 아니라 서로 관련된 값이기 때문에 각각의 배열로 선언하기 보다는 하나의 클래스로 정의해서 하나의 배열로 다루는 것이 데이터의 무결성적인 측면에서 더 바람직하다.

//비객체지향적인 코드
Object[] key;
Object[] value;

//객체지향적인 코드
Entry[] table;
class Entry{
	Object key;
	Object value;
}

HashMap은 키와 값을 각각 Object 타입으로 저장한다. 즉, 어떠한 객체도 저장할 수 있지만 키는 주로 String을 대문자 또는 소문자로 통일해서 사용하곤 한다.
키(key)는 유일해야 하며, 값(value)은 데이터의 중복을 허용한다.
왜냐하면 키는 저장된 값을 찾는데 사용되기 때문이다.

생성자/메서드 설명
HashMap() HashMap 객체를 생성
HashMap(int initialCapacity) 지정된 값을 초기용량으로 하는 HashMap 객체를 생성
HashMap(int initialCapacity, float loadFactor) 지정된 초기용량과 load factor의 HashMap 객체를 생성
HashMap(Map m) 지정된 Map의 모든 요소를 포함하는 HashMap을 생성
void clear() HashMap에 저장된 모든 객체를 제거
Object clone() 현재 HashMap을 복제해서 반환
boolean containsKey(Object key) HashMap에 지정된 키가 포함되어 있는지 알려줌.(포함시 true)
boolean containsValue(Object value) HashMap에 저장된 키와 값이 포함되어있는지 알려줌.(포함시 true)
Set entrySet() HashMap에 지정된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장해서 반환
Object get(Object key) 지정된 키의 값을 반환. 못 찾으면 null 반환
Object geetOrDefault(Object key, Object defaultValue) 지정된 키의 값을 반환. 키를 못 찾으면 기본 값으로 지정된 객체를 반환
boolean isEmpty() HashMap이 비어있는지 알려줌.
Set keySet() HashMap에 저장된 모든 키가 저장된 Set을 반환
Object put(Object key, Object value) 지정된 키와 값을 HashMap에 저장
void putAll(Map m) Map에 저장된 모든 요소를 HashMap에 저장
Object remove(Object key) HashMap에서 지정된 키로 저장된 값을 제거
Object replace(Object key, Object value) 지정된 키의 값을 지정된 객체로 대체
boolean replace(Object key, Object oldValue, Object newValue) 지정된 키와 객체가 모두 일치하는 경우에만 새로운 객체로 대체
int size() HashMap에 저장된 요소의 개수를 반환
Collection values() HashMap에 저장된 모든 값을 컬렉션의 형태로 반환
import java.util.*;

public class HashmapEx2 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("김자바", 100);
        map.put("이자바", 100);
        map.put("강자바", 80);
        map.put("안자바", 90);

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

        while (it.hasNext()) {
            //Map.Entry는 Map 인터페이스에 정의된 static inner interface이다.
            Map.Entry e = (Map.Entry)it.next();
            System.out.println("이름 :" + e.getKey() + ", 점수 : " + e.getValue());
        }

        set = map.keySet();
        System.out.println("참가자명단" + set);

        Collection values = map.values();
        it = values.iterator();

        int total = 0;

        while (it.hasNext()) {
            Integer i = (Integer) it.next();
            total += i.intValue();
        }

        System.out.println("총점 : " + total);
        System.out.println("평점 : " + (float)total/set.size());
        System.out.println("최고점수 : " + Collections.max(values));
        System.out.println("최저점수 : " + Collections.min(values));
    }
}

실행결과

이름 :안자바, 점수 : 90
이름 :김자바, 점수 : 100
이름 :강자바, 점수 : 80
이름 :이자바, 점수 : 100
참가자명단[안자바, 김자바, 강자바, 이자바]
총점 : 370
평점 : 92.5
최고점수 : 100
최저점수 : 80

 

참고 자바의정석

반응형

'DEV > Java' 카테고리의 다른 글

[자바] 제네릭 와일드 카드  (9) 2023.02.16
[자바] Properties  (8) 2023.02.16
[자바] HashSet  (7) 2023.02.15
[자바] Comparator 와 Comparable  (3) 2023.02.14
[자바] Arrays  (7) 2023.02.14

댓글