프로그래밍 언어/JAVA(자바)

[자바/java] 순서대로 저장, 출력하는 HashMap - LinkedHashMap 사용하기

냠냠:) 2020. 8. 28. 16:13

HashMap ?

HashMap은 Map 인터페이스를 구현한 Map 컬렉션이다. 인터페이스를 상속하기 때문에 Map의 특성을 그대로 사용할 수 있다. Key-Value쌍의 데이터로 저장되는 구조를 갖고 있고 이 데이터는 모두 객체이다. 값은 중복될 수 있지만 key값은 고유한 값을 가져야 한다. 만약 이미 존재하는 key값과 동일한 key값을 put하게 되면 새로운 key값으로 교체된다. 

 

우리는 자주 HashMap을 사용한다. key-value 쌍의 데이터를 표현하기 위해서이기도 하고, 자연스럽게 중복을 원하지 않는 key-value 알고리즘을 사용해야 할 때 주로 사용한다. 

 

 

LinkedHashMap ?

HashMap은 위와 같은 특징을 갖고 있다. 하지만 한 가지 더 추가하자면 아래 사진과 같이 데이터 출력에 있어 순서를 보장하지 않는다는 것이다. 

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
        HashMap<StringString> hm = new HashMap<StringString>();
        hm.put("apple""빨강");
        hm.put("banana","노랑");
        hm.put("kiwi""초록");
        
        System.out.println(hm.entrySet());
        System.out.println(hm.keySet());
        System.out.println(hm.values());
        
    }
cs

HashMap - 콘솔에 찍힌 결과

 

 

알고리즘 문제나 로직을 짜다보면 가끔 순서가 보장되는 HashMap이 필요한 상황이 온다. 그럴 때 사용하는 것이 LinkedHashMap이다.

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
        LinkedHashMap<StringString> lhm = new LinkedHashMap<StringString>(); 
        lhm.put("apple""빨강");
        lhm.put("banana","노랑");
        lhm.put("kiwi""초록");
        
        System.out.println(lhm.entrySet());
        System.out.println(lhm.keySet());
        System.out.println(lhm.values());
    }
cs

LinkedHashMap - 콘솔에 찍힌 결과

 

위 사진과 같이 LinkedHashMap을 이용하면 ArrayList와 같이 또는 Array와 같이 사용할 수 있으면서 HashMap의 장점을 그대로 사용할 수 있다.

 

 


**추가적으로 LinkedHashMap에서는 removeEldestEntry()라는 메소드를 오버라이드해서 사용할 수 있다.**

removeEldestEntry - 이름과 같이 가장 오래된 Entry를 지우는 것인데, 사용방법은 아래와 같이 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) {
        LinkedHashMap<StringString> lhm = new LinkedHashMap<StringString>(){
            @Override
            protected boolean removeEldestEntry(Entry<StringString> 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());
    }
cs

size()  -  hm.size(); 할 때 그 size()이다. 오버라이드 했기 때문에 size()로 사용할 수 있다.

size() == 3 ? true : flase -  삼항연산자, size()가 3일 때 true를 반환한다. true를 반환한 순간부터 가장 오래된 데이터를 삭제하고 새로 입력되는 데이터를 put한다. ex) 초록을 put하는 시점에 lhm은 size()가 3이 되고 그 순간 가장 오래된 "빨강"이라는 데이터를 삭제하는 것이다.

반응형