HashMap
HashMap은 Map 인터페이스에 속해있는 컬렉션이다.
Map 인터페이스의 기본 기능들을 전부 구현할 수 있다.
데이터들은 모두 (키, 값)의 1:1 구조로 되어있는 Entry로 되어있다.
같은 키의 값을 삽입하려고하면 해당 키의 값이 변경된다.
키는 고유한 속성이지만 값은 고유한 속성이 아니다.
키는 중복이 되지 않지만 값은 중복될 수 있다.
다른 특징은 HashTable과 유사하지만 동기화가 되지 않고 Null 값도 저장이 가능하다.
HashMap 선언 및 사용
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap hm = new HashMap(); // 타입 설정x Object 입력
HashMap<Integer, Integer> i = new HashMap<>(); // Integer, Integer 타입 설정
HashMap<Integer, Integer> i2 = new HashMap<>(i); // i의 값을 i2에 카피
HashMap<Integer, Integer> i3 = new HashMap<>(10); // 초기용량 지정
HashMap<Integer, Integer> i4 = new HashMap<>() {{ // 변수 선언 + 초기값 지정
put(1, 100);
put(2, 200);
}};
HashMap<String, String> str = new HashMap<String, String>(); // String, String 타입 설정
HashMap<Character, Character> ch = new HashMap<Character, Character>(); // Char, Char 타입 설정
}
}
HashMap을 선언하는 방법은 여러가지이다.
HashMap은 Key, Value 2개의 값을 가지고 있으므로 타입을 선언하려면 두 개의 타입을 선언해야 한다.
HashMap <타입, 타입> 변수명 = new HashMap <타입, 타입>();으로 선언한다.
HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 생성자를 초출하면 된다. HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 List처럼 저장공간을 한 칸씩 늘리지 않고 약 2배로 늘린다. 여기서 과부하가 많이 발생한다.
그렇기에 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해주는 것이 좋다.
HashMap 값 추가
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<String, String>(); // HashMap 선언
// 값 추가
hm.put("1", "Hello1");
hm.put("2", "World2");
hm.put("3", "Hello3");
hm.put("4", "World4");
hm.put("2", "WorldWorld2");
System.out.print(hm); // 결과 출력
}
}
HashMap의 값을 추가는 put을 사용한다.
들어가는 타입은 변수를 선언할 당시의 타입으로 맞춰서 입력해야 한다.
만약 같은 키 값의 데이터를 put 하면 기존의 Value가 나중에 넣은 Value로 변경된다.
결과
{1=Hello1, 2=Worldworld2, 3=Hello3, 4=World4}
HashMap 값 삭제
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<String, String>(); // HashMap 선언
// 값 추가
hm.put("1", "Hello1");
hm.put("2", "World2");
hm.put("3", "Hello3");
hm.put("4", "World4");
System.out.println(hm); // 결과 출력
hm.remove("3");
System.out.println(hm); // 결과 출력
hm.clear();
System.out.println(hm); // 결과 출력
}
}
HashMap의 값을 삭제는 remove(key) 메서드를 사용한다.
모든 값을 제거하려면 clear() 메소드를 사용하면 된다.
결과
{1=Hello1, 2=World2, 3=Hello3, 4=World4}
{1=Hello1, 2=World2, 4=World4}
{}
HashMap 값 출력
향상된 for문 사용
HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
put(1,"사과");
put(2,"바나나");
put(3,"포도");
}};
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));//key값 1의 value얻기 : 사과
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
//KeySet() 활용
for(Integer i : map.keySet()){ //저장된 key값 확인
System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
HashMap을 출력하는 방법에는 다양한 방법이 있다. 그냥 print 하게 되면 {}로 묶어 Map의 전체 key값, value가 출력된다. 특정 key값의 value를 가져오고 싶다면 get(key)메소드를 사용하면 되고 전체를 출력하려면 entrySet() 이나 keySet()메소드를 활용하여 Map의 객체를 반환받은 후 출력하면 된다. entrySet()은 key와 value 모두가 필요할 경우 사용하며 keySet()은 key 값만 필요할 경우 사용하는데 key값만 받아서 get(key)를 활용하여 value도 출력할 수도 있기에 어떤 메소드를 선택하든지 간에 큰 상관이 없어 대부분 코드가 간단한 keySet을 활용하시던데 key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋습니다.
Iterator 사용
HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
put(1,"사과");
put(2,"바나나");
put(3,"포도");
}};
//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<Integer, String> entry = entries.next();
System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
int key = keys.next();
System.out.println("[Key]:" + key + " [Value]:" + map.get(key));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
HashMap의 전체 출력 시 반복문을 사용하지 않고 Iterator를 사용해도 된다. Iterator로 Map안의 전체 요소를 출력하는 방법이다.
'Java' 카테고리의 다른 글
객체 지향의 5가지 원칙 (1) | 2023.01.27 |
---|---|
[Java] 어노테이션(Annotation) (1) | 2022.11.24 |
[Java] ArrayList (0) | 2022.11.23 |
[Java] Reflection(리플렉션) 이란? (0) | 2022.11.03 |
[Java] 싱글톤 패턴 (0) | 2022.11.02 |