문제
내가 작성한 정답
특징 | HashMap | LinkedHashMap | TreeMap | Hashtable (참고) |
목적 | 가장 빠른 키-값 매핑 | 삽입/접근 순서 유지 | 키 기준 자동 정렬 | 동기화된 키-값 매핑 (레거시) |
내부 구현 | 해시 테이블 | 해시 테이블 + 이중 연결 리스트 | 레드-블랙 트리 | 해시 테이블 |
순서 | 보장 안됨 | 삽입 순서 보장 (또는 접근 순서) | 키의 자연스러운 순서로 정렬 | 보장 안됨 |
null 키 | 허용 (1개) | 허용 (1개) | 불허용 | 불허용 |
null 값 | 허용 | 허용 | 허용 | 불허용 |
스레드 세이프티 | 아님 (비동기) | 아님 (비동기) | 아님 (비동기) | 맞음 (동기화됨) |
기본 성능 | 삽입/검색/삭제 O(1) 평균 | 삽입/검색/삭제 O(1) 평균 | 삽입/검색/삭제 O(logN) | 삽입/검색/삭제 O(1) 평균 (느린 동기화) |
주요 사용처 | 일반적인 빠른 키-값 조회 | 캐시(LRU), 순서 보존 매핑 | 정렬된 데이터, 범위 검색 | 레거시 또는 특별한 동기화 필요 시 |
1. Map이용
import java.util.*;
class Solution {
public int solution(int[] rank, boolean[] attendance) {
int answer = 0;
Map<Integer,Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
for(int i=0; i<rank.length; i++){
if(attendance[i]) {
map.put(rank[i], i);
list.add(rank[i]);
}
Collections.sort(list);
}
return 10000*map.get(list.get(0))+100*map.get(list.get(1))+map.get(list.get(2));
}
}2. 클래스 생성
import java.util.*;
class Student {
int num;
int pla;
public Student(int i, int p) {
this.num = i;
this.pla = p;
}
}
class Solution {
public int solution(int[] rank, boolean[] attendance) {
int answer = 0;
ArrayList<Student> list = new ArrayList();
for(int i=0; i<attendance.length; i++){
if(attendance[i]) list.add(new Student(i,rank[i]));
}
Collections.sort(list,(s1,s2)->s1.pla-s2.pla);
return list.get(0).num*10000+list.get(1).num*100+list.get(2).num;
}
}1. Map (인터페이스)
Map은 자바 컬렉션 프레임워크의 핵심 인터페이스 중 하나입니다.- 역할: 키(Key)와 값(Value)의 쌍으로 데이터를 저장하고 관리하는 자료구조의 명세(Specification)를 정의합니다.
- 특징:
- 키는 중복될 수 없습니다. 각 키는 정확히 하나의 값에만 매핑됩니다.
- 값(Value)은 중복될 수 있습니다.
- 대표적인 구현체로는
HashMap,TreeMap,LinkedHashMap등이 있습니다.
- 비유:
Map은 '사전' 또는 '전화번호부' 와 같습니다. 단어(키)와 그 의미(값), 또는 이름(키)과 전화번호(값)를 짝지어 관리하죠.
2. Map.Entry (정적 중첩 인터페이스)
Map.Entry는 Map 인터페이스 내부에 정의된 **정적 중첩 인터페이스(Static Nested Interface)**입니다.- 역할:
Map에 저장되는 하나의 키-값 쌍(Key-Value Pair)을 표현하는 인터페이스입니다.
- 특징:
getKey(): 이 엔트리의 키를 반환합니다.getValue(): 이 엔트리의 값을 반환합니다.setValue(V value): 이 엔트리의 값을 변경합니다.Map은 여러 개의Key-Value쌍을 가질 수 있는데,Map.Entry는 그 각각의 개별 쌍 하나하나를 나타냅니다.
- 비유:
Map.Entry는 사전에서 '단어: 의미' 한 줄, 또는 전화번호부에서 '이름: 전화번호' 한 줄을 구성하는 개별 항목 하나하나라고 생각할 수 있습니다.
주요 차이점 요약
구분 | Map | Map.Entry |
역할 | 키-값 쌍들의 모음 (Collection) | 하나의 키-값 쌍 (Pair) |
단위 | 전체 사전/전화번호부 | 사전/전화번호부의 개별 항목 (한 줄) |
메서드 예시 | put(), get(), remove(), keySet(), values(), entrySet() | getKey(), getValue(), setValue() |
위치 | 컬렉션 프레임워크의 최상위 인터페이스 | Map 인터페이스 안에 정의된 중첩 인터페이스 |
객체 생성 | new HashMap<>() 등으로 구현체 생성 | Map.entrySet()를 통해 Map에서 얻어옴 |
Map.Entry가 왜 필요한가? (예시)
Map은 키를 주면 값을 얻을 수 있지만, 때로는 모든 키-값 쌍을 동시에 탐색하거나, 값(Value)을 기준으로 정렬하고 싶을 때가 있습니다. 이럴 때 Map.Entry가 사용됩니다.가장 흔하게 사용되는 경우는
Map의 entrySet() 메서드를 호출할 때입니다.Share article