[day14] java-basic : Map

2 분 소요

Map의 특징

  • Key와 Value의 한 쌍으로 나누어서 데이터를 관리한다.

  • 목적은 Value값들을 저장하는 것이다.

  • 이때, Value값들 빠르게 탐색하기 위한 대안으로 Key를 활용하는 것이다.

  • Key는 반드시 구분되어야 하기 때문에 중복값을 허용하지 않는다.

  • Map은 Collection을 상속받지 않는다.

  • 구현클래스는 HashMap과 TreeMap이 있다.

Map의 메소드

  • put(K key, V value) : key와 value쌍으로 데이터를 입력한다. key가 중복되는 경우 새로운 값으로 업데이트하고 기존 값을 반환한다.

  • get(Object key) : key를 매개변수로 value값을 반환한다. 값이 없을 경우에는 null을 반환한다.

  • remove(Object key) : 데이터를 삭제하는 것이다. 값이 없을 경우엔 null을 반환한다.

  • boolean containsKey(Object Key) : 특정 키 확인하기, key가 존재하면 true를 반환한다.

  • boolean containsValue(Object value) : 특정 value를 가지는 key가 존재하면 true, 없으면 false를 반환한다.

  • putAll(Map<K key, V value> m) : 특정 map의 내용 전체를 다른 map에 추가할 때 사용한다.

  • Set<Map.Entry<K,V>> entrySet() : 실제 데이터를 가지고 있는 Map.EntrySet 집합을 반환한다.

class Map {
  
  // Entry : Map의 inner Class ==> Map.Entry
  class Entry {
    Object key;
    Object value;
  }

}
// entrySet을 활용해서 Map의 전체 데이터 출력하기

// Map 선언
Map<String, String> map = new HashMap<>();
  map.put("aaa", "1111");
  map.put("bbb", "2222");
  map.put("ccc", "3333");
  map.put("ddd", "4444");

// entrySet으로 Set 객체 생성하기
Set<Entry<String, String>> entries = map.entrySet(); 

// 각 enties 출력하기
for(Entry<String, String> entry : entries) {
  System.out.println(entry);
}
  • keySet() : key들은 set으로 묶어서 반환한다.
// keySet으로 Map의 전체 데이터 출력하기

// Map 선언
Map<String, String> map = new HashMap<>();
  map.put("aaa", "1111");
  map.put("bbb", "2222");
  map.put("ccc", "3333");
  map.put("ddd", "4444");

// keySet으로 인스턴스 생성
Set<String> keySet = map.keySet();

// keySet에 저장된 key들 출력하기
for(String key: keySet) {
  System.out.println(key);
}
  • getOrDefault(Object key, V defaultValue) : key가 있으면 해당 키의 value를 출력하고, 없으면 defaultValue를 return한다.

  • Set이 검색속도를 빠르게 해주기 때문에 Set으로 변환해서 출력하는 것이다.

Map의 내용 비교

  • Object클래스의 equals메소드는 주소값만 비교하는데,주소값이 상관없에 내용이 같으면 같은 객체로 인식할 수 있는 방법이 있다.

  • 그것이 바로 equals 메소드를 오버라이딩 해서 내용 비교를 하게 만들고 hash코드도 같게 만드는 방법이다.

  • 근데 해시코드까지 같게 만드는 것은 너무 귀찮다.

  • 이때 이클립스 내 [Source]에서 hashcode와 equals를 클릭해 자동으로 만드는 방법이 사용하면 된다.

	/**
	 * 이클립스에서 자동으로 생성해준 hashcode와 equals
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((phone == null) ? 0 : phone.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Member other = (Member) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (phone == null) {
			if (other.phone != null)
				return false;
		} else if (!phone.equals(other.phone))
			return false;
		return true;
	}