[day14] java-basic : Map
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.Entry
의Set
집합을 반환한다.
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;
}