본문 바로가기

개발/java

Java Map, HashMap 정렬, 순서가 필요할 때 : LinkedHashMap

아임 더 맵! 아임 더 맵!

 

회사 휴대폰결제 모듈인 TeleditClient 중 SClient 는 오랜 고질병을 앓고 있었다.

치명적인 문제는 아니지만, Output 으로 출력하는 결과물이 순서가 없이 뒤죽박죽 출력되는 것이다.

 

이 문제는 HashMap 을 사용했기 때문에 발생하는 결과이다.

HashMap은 Key, Value 한 쌍으로 이루어졌지만, Key에 대한 순서는 제공하지 않는다.

그래서 사용하는 것이 LinkedHashMap 이다.

java 에서 기본으로 제공하는 라이브러리이며, HashMap 과 완벽 호환이 가능하다.

 

Tech 사이트에서 제공하는 jar 파일을 압축해제하고,

class파일을 디컴파일하면 java 소스코드를 볼 수 있는데,

Output 으로 내보낼 파라미터를 가공하는 중, String to Map 변환과정에서 문제가 발생한다.

여기서 String 을 파싱하고 배열에 저장,

배열에서 Map에 담을 때 Map에서 순서가 사라진다.

 

여기 Map 을 LinkedHashMap 으로 바꿔주니 간단하게 해결되었다.

 

신기한 점은,

Map elem = stringToMap(param)

위 코드에서, stringtoMap() 함수가 리턴한 객체는 LinkedHashMap 이었는데,

elem 객체는 Map 으로 선언되었지만 getClass()로 타입확인시 LinkedHashMap 으로 확인된다.

LinkedHashMap 은 HashMap 의 부분집합이고,

한번 LinkedHashMap 으로 정의되면 그 형태를 유지하는 특성을 확인할 수 있다.


아래는 간략하게 잘 설명된 HashMap 의 기본 사용법이다. (타블로그에서 가져옴)

이는 LinkedHashMap 도 동일하게 적용된다.

차이점은 LinkedHashMap 은 put 한 순서가 보장이 되는 점이다.

 

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의 갯수를 구한다.


출처: https://fruitdev.tistory.com/141

 

 

반응형