HashMap은 'value(원소)'와, 그 원소를 가리키는 'key' 값을 같이 저장한다.
순서만 있는 ArrayList와 달리, key와 value가 쌍을 이루고 있다.
사용
HashMap의 키로는 String을 쓰는 것이 가장 일반적이다. 이름이나 'ID'를 담기에 String이 가장 쉽고 직관적이기도 하고, HashMap의 동작 원리상 String이 적합
선언하기
선언과 인스턴스 생성은 ArrayList와 매우 비슷합니다. 꺽쇠 안에 key와 value의 자료형을 적어줍니다.
HashMap 기본구조
HashMap<키의 자료형, 원소의 자료형> 변수명 = new HashMap<>();
HashMap<String, Pokemon> pokedex = new HashMap<>();
Key-Value 쌍 추가하기
HashMap에 쌍을 추가할 때는 put 메소드를 사용. 첫 번째 파라미터로 key를 넘겨주고, 두 번째 파라미터로 value를 넘겨주면된다.
pokedex.put("피카츄", new Pokemon("피카츄"));
pokedex.put("파이리", new Pokemon("파이리"));
pokedex.put("이상해씨", new Pokemon("이상해씨"));
pokedex.put("이상해풀", new Pokemon("이상해풀"));
pokedex.put("이상해꽃", new Pokemon("이상해꽃"));
값 꺼내기
원소를 꺼낼 때는 get 메소드를 사용하면 된다. 찾고자 하는 value에 해당하는 key를 파라미터로 넘겨주면 된다.
Pokemon pikachu = pokedex.get("피카츄");
원소 덮어쓰기
같은 key에 여러 value를 저장하면 가장 마지막에 저장된 value로 덮어 씌워진다.
이렇게 하면, 앞서 넣었던 '피카츄' 인스턴스는 이제 '라이츄' 인스턴스로 덮어지게 된다.
pokedex.put("피카츄", new Pokemon("라이츄");
반복문을 통해 HashMap 탐색하기
HashMap의 keyset메소드는 모든 key를 담고 있는 Set을 리턴해준다. Set은 List나 Map과 같이 원소를 담고 있는 자료형 중 하나이며 'for each'문으로 탐색이 가능하다.
for (String key : pokedex.keySet()) {
System.out.println(pokedex.get(key));
}
(심화) HashMap의 동작 원리
HashMap의 key는 'hashcode'라는 것으로 관리됩니다.
이 hashcode는 모든 클래스의 인스턴스가 가진 고유한 값인데, 인스턴스마다 다르기 때문에 HashMap이 key를 구분하는 값으로 사용됩니다(여러 인스턴스가 같은 hashcode를 가질 수 있으며, 이 경우 HashMap에선 key.equals(anotherKey) 메소드로 구분합니다).
일반적인 클래스는 인스턴스 생성시 hashcode 값이 결정됩니다. 즉, 같은 정보를 담고 있는 두 인스턴스가 서로 다른 hashcode를 가질 수 있다는 말입니다.
그런데 String은 서로 다른 인스턴스라도 안의 내용이 같으면 같은 hashcode를 갖습니다. 그렇기 때문에 HashMap의 key로서 String이 매우 적합합니다. Key는 실제 인스턴스보다는 안에 담긴 의미, 내용으로 구분하는 것이 좋기 때문입니다.
+ HashMap을 사용하기 위해서는 상단에 import java.util.Hashmap; 코드를 꼭 작성할 것!
<HashMap 공부 전체 코드>
import java.util.HashMap;
import java.util.ArrayList;
public class Main {
public static void main(String[] args){
ArrayList<Pokemon> arrayList = new ArrayList<>();
arrayList.add(new Pokemon("이상해씨"));
arrayList.add(new Pokemon("이상해풀"));
arrayList.add(new Pokemon("이상해꽃"));
System.out.println(arrayList.get(0));
System.out.println(arrayList.get(1));
System.out.println(arrayList.get(2));
// HashMap
// Key -> Value
// HashMap<키의 자료형, 원소의 자료형> 변수명 = new 변수명<>();
HashMap<String, Pokemon> pokedex = new HashMap<>();
// 새로운 원소를 넣을 때 put 메소드 사용
// 키, 원소(키 1개당 원소 1개만 가능, 키1개에 2가지 원소를 저장하면 마지막에 저장한 원소가 남음)
pokedex.put("피카츄", new Pokemon("피카츄"));
pokedex.put("피카츄", new Pokemon("피츄"));
pokedex.put("라이츄", new Pokemon("라이츄"));
pokedex.put("이상해씨", new Pokemon("이상해씨"));
pokedex.put("이상해풀", new Pokemon("이상해풀"));
pokedex.put("이상해꽃", new Pokemon("이상해꽃"));
// 해쉬맵에서 이상해풀을 지워도 이상해꽃을 가져오는데 아무런 문제가 없음
// why? Index와 상관이 없다. 이상해풀을 지워도 인덱스가 밀리지 않음
pokedex.remove("이상해풀");
Pokemon poke003 = pokedex.get("이상해꽃");
// 23번 째 줄 : 마지막에 덮은 피츄로 결과값이 나옴
System.out.println(pokedex.get("피카츄"));
// 키 값의 원소들을 받아올 수 있음
// pokedex.keySet();
for(String key : pokedex.keySet()) {
System.out.println(pokedex.get(key));
}
}
}
'TIL > Java' 카테고리의 다른 글
[Java] break, continue (0) | 2022.01.14 |
---|---|
[Java] 나의 영어 사전 (0) | 2022.01.11 |
[Java] 김신 장군 살리기 (0) | 2022.01.11 |
[Java] Wrapper Class / Array List (0) | 2022.01.10 |
[Java] 숫자 도구(Math, Random) (0) | 2022.01.10 |