HashMap은 Map 인터페이스를 구현한 Map 컬렉션이다. 인터페이스를 상속하기 때문에 Map의 특성을 그대로 사용할 수 있다. Key-Value쌍의 데이터로 저장되는 구조를 갖고 있고 이 데이터는 모두 객체이다. 값은 중복될 수 있지만 key값은 고유한 값을 가져야 한다. 만약 이미 존재하는 key값과 동일한 key값을 put하게 되면 새로운 key값으로 교체된다.
우리는 자주 HashMap을 사용한다. key-value 쌍의 데이터를 표현하기 위해서이기도 하고, 자연스럽게 중복을 원하지 않는 key-value 알고리즘을 사용해야 할 때 주로 사용한다.
LinkedHashMap ?
HashMap은 위와 같은 특징을 갖고 있다. 하지만 한 가지 더 추가하자면 아래 사진과 같이 데이터 출력에 있어 순서를 보장하지 않는다는 것이다.
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("apple", "빨강");
hm.put("banana","노랑");
hm.put("kiwi", "초록");
System.out.println(hm.entrySet());
System.out.println(hm.keySet());
System.out.println(hm.values());
}
HashMap - 콘솔에 찍힌 결과
알고리즘 문제나 로직을 짜다보면 가끔 순서가 보장되는 HashMap이 필요한 상황이 온다. 그럴 때 사용하는 것이 LinkedHashMap이다.
public static void main(String[] args) {
LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>();
lhm.put("apple", "빨강");
lhm.put("banana","노랑");
lhm.put("kiwi", "초록");
System.out.println(lhm.entrySet());
System.out.println(lhm.keySet());
System.out.println(lhm.values());
}
LinkedHashMap - 콘솔에 찍힌 결과
위 사진과 같이 LinkedHashMap을 이용하면 ArrayList와 같이 또는 Array와 같이 사용할 수 있으면서 HashMap의 장점을 그대로 사용할 수 있다.
**추가적으로 LinkedHashMap에서는 removeEldestEntry()라는 메소드를 오버라이드해서 사용할 수 있다.**
removeEldestEntry - 이름과 같이 가장 오래된 Entry를 지우는 것인데, 사용방법은 아래와 같이 사용할 수 있다.
public static void main(String[] args) {
LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>(){
@Override
protected boolean removeEldestEntry(Entry<String, String> eldest) {
return size() == 3 ? true : false;
}
};
lhm.put("apple", "빨강");
lhm.put("banana","노랑");
lhm.put("kiwi", "초록");
System.out.println(lhm.entrySet());
System.out.println(lhm.keySet());
System.out.println(lhm.values());
}
size() - hm.size(); 할 때 그 size()이다. 오버라이드 했기 때문에 size()로 사용할 수 있다.
size() == 3 ? true : flase - 삼항연산자, size()가 3일 때 true를 반환한다. true를 반환한 순간부터 가장 오래된 데이터를 삭제하고 새로 입력되는 데이터를 put한다. ex) 초록을 put하는 시점에 lhm은 size()가 3이 되고 그 순간 가장 오래된 "빨강"이라는 데이터를 삭제하는 것이다.
'Languages | Frameworks > Spring' 카테고리의 다른 글
[Spring] jsessionid를 url에 노출안시키기(쿠키를 통해서만 세션 유지) (0) | 2022.06.02 |
---|---|
Cookie를 사용한 로그인/로그아웃(세션쿠키) + 보안 (0) | 2022.05.30 |
[SpringBoot] RestApi 구현하기 위한 List<Map> 사용 (0) | 2022.05.02 |
[SpringBoot] mybatis resultType HashMap Null값 받기 (0) | 2022.05.02 |
Validator분리 - @InitBinder, @Validated (0) | 2022.03.30 |