[Java] 자바 컬렉션 - [Map] HashMap(java.util.HashMap)


컬렉션 클래스 : Map

- 값을 저장할 때 key 개체의 해시 값(hash value)을 사용하여 저장한다.

- 값을 꺼낼 때도 key 객체의 해시 값을 사용하여 꺼낸다.

- 값을 중복 저장할 수 없다.

- 순서대로 저장하고 순서대로 꺼낼 수 없다.

- 보통 문자열 라벨을 사용하여 값을 저장하고 꺼낼 때 주로 사용한다.

- 예)

   HashMap :

    - key나 value로 null을 허용한다.

    - 동기화를 지원하지 않는다.

       => 여러 스레드가 동시에 접근하여 값을 변경하는 것을 막지 않는다.

       => 데이터의 입출력 속도가 빠르다.

       => 대신 여러 스레드가 동시에 값을 바꿀 수 있기 때문에 

               멀티 스레드 상황에서 사용할 때 주의해야 한다.

    Hashtable : 

     - key나 value로 null을 허용하지 않는다.

     - 동기화를 지원한다.

       => 여러 스레드가 동시에 접근하더라도 그 중 한개의 스레드만이 접근할 수 있다.

        => 데이터의 입출력 속도가 느리다.

        => 대신 여러 스레드가 동시에 값을 바꿀 수 없기 때문에

             멀티 스레드 상황에서 안전하게 사용할 수 있다.


put(key, value)

- key 객체 : 

  1) key 객체의 hashCode() 리턴 값을 사용하여

      value를 저장할 때 사용할 위치를 계산한다.

  2) 그래서 key 객체는 같은 값을 가진 객체인 경우

      같은 hashCode()를 리턴하는 클래스를 사용한다.

      예) String, 랩퍼 클래스(Byte, Short, Integer, Long, Float, Double, Boolean 등)

- value 객체: Map 컬렉션에 보관될 값



Map에서 값을 꺼내는 방법 I

- 값을 저장할 때 사용한 key를 통해 꺼낸다.

- 반드시 같은 인스턴스일 필요는 없다.

  저장할 때 사용한 key의 hashCode() 리턴 값과 

  같은 hash value를 가진다면 값을 꺼내는 key로 사용할 수 있다.

  물론 equals()의 결과도 true여야 한다.



값을 저장할 BooK class 예제


static class Book {
    String title;
    String press;
    int page;
   
    public Book(String title, String press, int page) {
      this.title = title;
      this.press = press;
      this.page = page;
    }
   
    public String toString() {
      return String.format("%s, %s, %d", title, press, page);
    }

  }




Map에서 값을 꺼내는 호출 코드


public static void main(String[] args) {

    HashMap map = new HashMap();
    
    map.put(new String("key1"), new Book("aaaa", "유리출판사", 100));
    map.put("key2", new Book("bbbb", "유리출판사", 200));
    map.put(3, new Book("cccc", "유리출판사", 300));
    
    System.out.println(map.get(new String("key1")));
    System.out.println(map.get(3));
  }

}

- 실행 결과 : 

aaaa, 유리출판사, 100

cccc, 유리출판사, 300



* 참고 :

  key 값에 올 수 있는 건 인스턴스 뿐인데 어째서 key 값으로 숫자 1을 넣어줄 수 있는 것인가? 

  => 랩퍼 클래스(wrapper class)는 오토 박싱 (auto-boxing) 기능을 가지고

     있어서 인스턴스를 요구하는 명령어가 있을 경우, key 값으로 써준 숫자 1을

     자동적으로 new Integer(1)로 만들어 준다.

      

** 참고 :

   map.get(key)메서드가 리턴하는 것은 key 값에 해당되는 인스턴스의

   toString() 메서드 리턴 값이다.




Map에서 값을 꺼내는 방법 II


- 값 목록을 리턴 받아 꺼낸다.


 Collection valueList map.values();
    // 값이 들어 있는 컬렉션에서 값을 한 개씩 꺼내줄 도구를 얻는다.
 Iterator iterator = valueList.iterator();
   
 while(iterator.hasNext()) {
   System.out.println(iterator.next());

 }





Map에서 값을 꺼내는 방법 III


- key 목록을 리턴 받아 꺼낸다


Set KeySet = map.KeySet();
Object[] keyArray = keySet.toArray();
 for (int i = 0; i < keyArray.length; i++) {
   System.out.println(map.get(keyArray[i]));

 }





Map에서 값을 꺼내는 방법 V


- key와 value를 한쌍으로 하는 목록을 리턴 받는다.


Set entrySet = map.entrySet();
    for (Object object : entrySet) {
      Entry entry = (Entry)object;
      System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());

    }











블로그 이미지

필로그래머

,