HashMap
- Map 컬렉션 클래스에서 가장 많이 사용되는 클래스로, 키와 값의 쌍으로 데이터를 저장한다.
- 해시 알고리즘을 사용하기 때문에 데이터를 검색하는 데에 있어 뛰어난 성능을 보인다.
- 내부적으로 Entry라는 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언해서 구현되어 있다.
public interface Map {
public static interface Entry {
Object getKey(); // Entry의 key 객체를 반환
Object getValue(); // Entry의 value 객체를 반환
Object setValue(Object value); // Entry의 value 객체를 지정된 객체로 변환
boolean equals(Object o); // 동일한 Entry인지 비교
int hashCode(); // Entry의 해시코드 반환
}
}
- 키와 값을 각각 Object 타입으로 저장하기 때문에 어떠한 객체도 저장할 수 있지만, 키는 주로 String을 대문자 또는 소문자로 통일해서 사용한다.
- 키는 저장된 값을 찾는데 사용되기 때문에 중복을 허용하지 않지만, 같은 값을 다른 키로 저장하는 것은 가능하다.
public class HashMapTest {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("user1", 90);
map.put("user2", 80);
map.put("user1", 100);
map.put("user3", 90);
// 키와 값을 함께 읽어온다.
Set set = map.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry) it.next();
System.out.println("이름: " + e.getKey() + ", 점수: " + e.getValue());
}
// 키를 읽어온다.
set = map.keySet();
System.out.println("참가자 명단: " + set);
// 값을 읽어온다.
Collection values = map.values();
it = values.iterator();
int total = 0;
while (it.hasNext()) {
Integer i = (Integer) it.next();
total += i.intValue();
}
System.out.println("total = " + total);
}
}
TreeMap
- 키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리의 형태로 저장하는 자료구조로, 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
- 검색에 관한한 대부분의 경우에서 HashMap이 TreeMap보다 성능이 좋기 때문에 HashMap를 사용하는 것이 좋지만, 범위 검색이나 정렬이 필요한 경우에는 TreeMap을 사용하는 것이 더 좋다.
- HashMap과는 달리 키가 오름차순으로 정렬된다.
public class TreeMapTest {
public static void main(String[] args) {
String[] data = {"A", "K", "A", "K", "D", "K", "A", "K", "K", "K", "Z", "D"};
TreeMap map = new TreeMap();
for (int i = 0; i < data.length; i++) {
if (map.containsKey(data[i])) {
Integer value = (Integer) map.get(data[i]);
map.put(data[i], value + 1);
}
else {
map.put(data[i], 1);
}
}
Iterator it = map.entrySet().iterator();
System.out.println("기본정렬");
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
int value = (Integer) entry.getValue();
System.out.println(entry.getKey() + " : " + printBar('#', value) + " " + value);
}
System.out.println();
// map을 ArrayList로 변환한 다음 Collections.sort()로 정렬
Set set = map.entrySet();
List list = new ArrayList(set);
Collections.sort(list, new ValueComparator());
it = list.iterator();
System.out.println("값의 크기가 큰 순으로 정렬");
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
int value = (Integer) entry.getValue();
System.out.println(entry.getKey() + " : " + printBar('#', value) + " " + value);
}
}
static class ValueComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Map.Entry && o2 instanceof Map.Entry) {
Map.Entry e1 = (Map.Entry) o1;
Map.Entry e2 = (Map.Entry) o2;
int v1 = ((Integer) e1.getValue()).intValue();
int v2 = ((Integer) e2.getValue()).intValue();
return v2 - v1;
}
return -1;
}
}
public static String printBar(char ch, int value) {
char[] bar = new char[value];
Arrays.fill(bar, ch);
return new String(bar);
}
}
Properties
- HashMap의 구버전인 Hashtable을 상속받아 구현된 것으로, 키와 값을 (String, String) 형태로 저장하는 보다 단순화된 Map 컬렉션 클래스
- 주로 애플리케이션의 환경설정과 관련된 속성을 지정하는데 사용되며, 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다.
- Map의 특성상 저장 순서를 유지하지 않으며, Iterator 대신 Enumeration을 사용한다.
'Java > Java' 카테고리의 다른 글
Arrays, Collections (0) | 2022.03.28 |
---|---|
Comparable과 Comparator (0) | 2022.03.28 |
Iterator (0) | 2022.03.28 |
Set 컬렉션 클래스 (0) | 2022.03.28 |
컬렉션 프레임워크와 List 컬렉션 클래스 (0) | 2022.03.28 |