나는 개발을 할때 편리성으로 인하여 자주 HashMap을 사용한다.
Java의 HashMap은 단순히 Key/value가 쌍으로 움직이므로 데이터나 기타 다른 객체를 담아두기에 편리하고, 사용법 또한 간단하여 자주 이용하는 편이다. (Key, Value 라고 하니 NoSQL이 생각난다 ㅎㅎ)
HashMap 기본 사용법 |
1. 객체 선언
HashMap hm = new HashMap(); |
* HashMap<String, String> 처럼 HashMap의 key와 value의 type을 지정할 수 있으며,
위와 같이 생략이 HashMap<Object, Object> 형태가 된다. type을 Object로 지정하게 되면 데이터를 get 할때 type casting을 해주는등의 불편함이 있을수 있다.
2. 데이터 넣기 - put
HashMap hm = new HashMap(); hm.put("강아지", "뚱이"); hm.put("고양이", "나비"); |
3. 데이터 꺼내기 - get
String dogName = (String)hm.get("강아지"); |
* HashMap에서 저장한 데이터의 key 이름을 지정하면 value 값을 얻어올수 있다.
4. key/value 삭제하기 - remove
hm.remove("강아지") |
* HashMap에서 해당하는 key를 완전히 삭제한다.
5. 특정 Key가 존재하는지 확인 - containsKey
if(containsKey("강아지")) 있음 else 없음 |
* containsKey를 이용하면 해당 Key 존재여부를 true/false로 리턴해준다.
6. HashMap key 갯수 구하기 - size
System.out.println( hm.size() ); |
* 해당 map의 전체 Key의 갯수를 구한다.
LinkedHashMap |
HashMap의 경우 다 좋은데, 단점이 하나 있다. 그 단점은 put을 통해 데이터나 객체를 넣을때 key의 순서가 지켜지지 않는다는 것이다. 개발을 할때 코드상으로 순차적으로 key/value를 넣어도, 실제 HashMap에서는 해당 순서가 지켜지지 않는다.
<HashMap 저장 예>
사실 업무의 특성이나 개발방법에 따라 입력된 key의 순서가 보장되어야 할때가 있고, 그렇지 않을때가 있다. 만약 입력된 Key의 순서가 보장되어야 한다면 LinkedHashMap을 사용하면 된다.
LinkedHashMap은 put을 통해 입력된 순서대로 Key가 보장되므로 해당 문제를 해결할 수 있다. 물론 사용법은 HashMap과 동일하다.
<LinkedHashMap 저장 예>
- 생성자
//첫번째 생성자
LinkedHashMap<String, Integer> map1 = new LinkedHashMap<String, Integer>();
//두번째 생성자
LinkedHashMap<String, Integer> map2 = new LinkedHashMap<String, Integer>(10);
//세번째 생성자
LinkedHashMap<String, Integer> map3 = new LinkedHashMap<String, Integer>(10, 0.75f);
//네번째 생성자
LinkedHashMap<String, Integer> map4 = new LinkedHashMap<String, Integer>(10, 0.75f, true);
//다섯번째 생성자
LinkedHashMap<String, Integer> map5 = new LinkedHashMap<String, Integer>(map1);
첫번째 생성자는 기본생성자로써 initial capacity(16), load factor(0.75)값을 가진 객체를 생성합니다.
두번째 생성자는 매개변수로 입력된 initial capacity값과 load factor(0.75)값을 가진 객체를 생성합니다.
세번째 생성자는 매개변수로 입력한 initial capacity, load factor값을 가진 객체를 생성합니다.
네번째 생성자는 initial capacity, load factor, accessOrder를 매개변수로 입력하여 객체를 생성합니다.
(아래에서 추가로 다루겠습니다.)
다섯번째 생성자는 매개변수로 Map객체를 입력하여 객체를 생성합니다. 생성된 객체는 Map객체의 mapping을 갖습니다.
네번째 생성자에 대해 알아보겠습니다.
(1) accessOrder : true일 경우
LinkedHashMap<String, Integer> map1 = new LinkedHashMap<String, Integer>(16, 0.75f, true);
map1.put("first", 2);
map1.put("second", 3);
map1.put("third", 4);
map1.put("fourth", 5);
map1.get("first");
map1.get("third");
map1.forEach((key, value) -> {
System.out.println("Key:" + key + ", Value:" + value);
});
결 과 |
Key:second, Value:3 |
Key:fourth, Value:5 |
Key:first, Value:2 |
Key:third, Value:4 |
(2) accessOrder : false일 경우
LinkedHashMap<String, Integer> map2 =LinkHashMap<String, Integer>(16, 0.75f, false);
map2.put("first", 2);
map2.put("second", 3);
map2.put("third", 4);
map2.put("fourth", 5);
map2.get("first");
map2.get("third");
map1.forEach((key, value) -> {
System.out.println("Key:" + key + ", Value:" + value);
});
결 과 |
Key:first, Value:2 |
Key:second, Value:3 |
Key:third, Value:4 |
Key:fourth, Value:5 |
accessOrder는 Entry에 access하는 mode를 나타냅니다.
true일 경우 입력된 순서 중에 access빈도 낮은 것들부터 접근합니다.
false일 경우 입력된 순서로 Entry에 접근합니다.
map1의 경우 accessOrder를 true로 지정하고 생성하였습니다.
get메소드에 first, third를 access하고 나면 first, third는 access빈도가 1이고, second, fourth의 경우 access빈도가 0입니다.
그래서 forEach()메소드를 통해서 결과를 출력하면 빈도수가 낮은 순부터 출력되는 것을 볼 수 있습니다.
* forEach() 옆에 -> 가 있는데 이것은 람다식 입니다. (람다식은 아직 공부를 하지 않았습니다.)
- 메소드
모든 메소드를 설명하지 않습니다.
(1) clear() 반환형: void
LinkedHashMap객체의 모든 mapping을 삭제합니다.
(2) containsValue(Object value) 반환형: boolean
매개변수로 입력된 value값이 LinkedHashMap 객체에 존재한다면 true, 없으면 false를 반환합니다.
(3) entrySet() 반환형: Set<Map.Entry<K,V>>
http://developer-syubrofo.tistory.com/7 에서 확인하실 수 있습니다.
(4) get(Object key) 반환형: K
LinkedHashMap 객체에 key에 해당하는 value가 있다면 그 값을 반환하고, 없으면 null을 반환합니다.
(5) getOrDefault(Object key, V defaultValue) 반환형: V
LinkedHashMap 객체에 key에 해당하는 value값이 있다면 그값을 반환하고, 없으면 매개변수로 입력된 defaultValue값을 반환합니다.
(6) keySet() 반환형: Set<K>
LinkedHashMap 객체에 모든 key값을 가진 Set객체를 반환합니다.
'Study > 개발일지' 카테고리의 다른 글
[백엔드온라인TIL] java 학습 13일차 (0) | 2023.06.09 |
---|---|
[백엔드스터디WIL]3주차 학습일지 (3) | 2023.06.09 |
[백엔드온라인TIL] java 학습 11일차 (0) | 2023.06.07 |
[백엔드온라인TIL] java 학습 10일차 (0) | 2023.06.05 |
[백엔드스터디WIL]3주차 학습일지 (0) | 2023.06.02 |