HashMap vs TreeMap vs Hashtable vs LinkedHashMap
지도 개관
자바 에는 네 가지 흔히 볼 수 있 는 맵 이 있 습 니 다.HashMap,TreeMap,HashTable 과 LinkedHashMap 입 니 다.우 리 는 한 마디 로 각 맵 을 묘사 할 수 있 습 니 다.다음 과 같 습 니 다.
HashMap:산 목록 을 바탕 으로 이 루어 지 는 것 은 무질서 합 니 다.TreeMap:빨 간 검 은 나 무 를 기반 으로 키 에 따라 정렬 합 니 다.링크 드 HashMap:삽입 순 서 를 저장 합 니 다.Hashtable:동기 화 되 어 HashMap 과 유사 합 니 다.HashMap
HashMap 의 Key 가 자신 이 정의 한 대상 이 라면 equals()와 hashCode()방법 을 덮어 쓰 고 약속 을 지 켜 야 합 니 다.
package simplejava;
import java.util.HashMap;
import java.util.Map.Entry;
class Dog {
String color;
Dog(String c) {
color = c;
}
public String toString() {
return color + " dog";
}
}
public class Q26 {
public static void main(String[] args) {
HashMap<Dog, Integer> hashMap = new HashMap<Dog, Integer>();
Dog d1 = new Dog("red");
Dog d2 = new Dog("black");
Dog d3 = new Dog("white");
Dog d4 = new Dog("white");
hashMap.put(d1, 10);
hashMap.put(d2, 15);
hashMap.put(d3, 5);
hashMap.put(d4, 20);
//print size
System.out.println(hashMap.size());
//loop HashMap
for (Entry<Dog, Integer> entry : hashMap.entrySet()) {
System.out.println(entry.getKey().toString() + " - " +
entry.getValue());
}
}
}
결과 출력:4
white dog - 5
red dog - 10
white dog - 20
black dog - 15
주의 하 세 요.우 리 는 부주의 로 두 개의"white dogs"를 추 가 했 지만,HashMap 은 여전히 그것 을 저장 합 니 다.이것 은 불합리한 것 이다.지금 우 리 는 도대체 몇 마리 의 흰 개가 HashMap 에 저장 되 어 있 는 지,5 인지 20 인지 곤 혹 스 럽 다.
사실 Dog 류 는 이렇게 정의 해 야 합 니 다.
class Dog {
String color;
Dog(String c) {
color = c;
}
public boolean equals(Object o) {
return ((Dog) o).color.equals(this.color);
}
public int hashCode() {
return color.length();
}
public String toString() {
return color + " dog";
}
}
결과 출력:3
red dog - 10
white dog - 20
black dog - 15
이 유 는 HashMap 에서 두 개의 같은 요 소 를 저장 할 수 없 기 때 문 입 니 다.기본적으로 Object 의 hashCode()와 equals()는 두 대상 이 같은 지 판단 하 는 데 사 용 됩 니 다.기본 hashCode()방법 은 서로 다른 대상 에 대해 서로 다른 값 을 되 돌려 줍 니 다.equals()방법 은 두 개의 인용 이 같 을 때 만 true 로 돌아 갑 니 다.잘 모 르 시 면 hashCode()와 equals()간 의 관 계 를 스스로 확인 하 실 수 있 습 니 다.
예 를 들 어 HashMap 에서 가장 자주 사용 하 는 방법,예 를 들 어 iteration,print 등 을 검증 할 수 있 습 니 다.
TreeMap
TreeMap 은 key 에 따라 정렬 된 것 입 니 다.다음 코드 를 먼저 보고'key 에 따라 정렬'사상 을 알 아 보 겠 습 니 다.
package simplejava;
import java.util.Map.Entry;
import java.util.TreeMap;
class Dog {
String color;
Dog(String c) {
color = c;
}
public boolean equals(Object o) {
return ((Dog) o).color.equals(this.color);
}
public int hashCode() {
return color.length();
}
public String toString() {
return color + " dog";
}
}
public class Q26 {
public static void main(String[] args) {
Dog d1 = new Dog("red");
Dog d2 = new Dog("black");
Dog d3 = new Dog("white");
Dog d4 = new Dog("white");
TreeMap<Dog, Integer> treeMap = new TreeMap<Dog, Integer>();
treeMap.put(d1, 10);
treeMap.put(d2, 15);
treeMap.put(d3, 5);
treeMap.put(d4, 20);
for (Entry<Dog, Integer> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
결과 출력:Exception in thread "main" java.lang.ClassCastException: simplejava.Dog cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at simplejava.Q26.main(Q26.java:34)
TreeSet 은 Key 를 기반 으로 정렬 되 어 있 기 때문에 key 의 대상 으로서 서로 비교 해 야 합 니 다.이것 이 바로 key 가 Comparable 인 터 페 이 스 를 실현 해 야 하 는 이유 입 니 다.예 를 들 어 문자열 을 Key 로 사용 할 수 있 습 니 다.String 이 Comparable 인 터 페 이 스 를 실 현 했 기 때 문 입 니 다.
이제 Dog 를 바 꿔 서 비교 할 수 있 도록 하 겠 습 니 다.다음 과 같 습 니 다.
package simplejava;
import java.util.Map.Entry;
import java.util.TreeMap;
class Dog implements Comparable<Dog> {
String color;
int size;
Dog(String c, int s) {
color = c;
size = s;
}
public String toString() {
return color + " dog";
}
@Override
public int compareTo(Dog o) {
return o.size - this.size;
}
}
public class Q26 {
public static void main(String[] args) {
Dog d1 = new Dog("red", 30);
Dog d2 = new Dog("black", 20);
Dog d3 = new Dog("white", 10);
Dog d4 = new Dog("white", 10);
TreeMap<Dog, Integer> treeMap = new TreeMap<Dog, Integer>();
treeMap.put(d1, 10);
treeMap.put(d2, 15);
treeMap.put(d3, 5);
treeMap.put(d4, 20);
for (Entry<Dog, Integer> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
결과 인쇄:red dog - 10
black dog - 15
white dog - 20
이 예 에서 우 리 는 dog 의 size 에 따라 정렬 합 니 다.
만약"Dog d4=new Dog("white",10);""Dog d4=new Dog("white",40);"로 대 체 됩 니 다.결 과 는 다음 과 같은 정 보 를 출력 합 니 다.
white dog - 20
red dog - 10
black dog - 15
white dog - 5
이것 은 현재 TreeMap 에서 compare To()를 사용 하여 key 를 비교 하기 때 문 입 니 다.서로 다른 size 는 서로 다른 dogs 를 의미 합 니 다.
HashTable
자바 문서 참조:HashMap 은 HashTable 과 기본적으로 유사 하 며,비 동기 화 및 null 허용 을 제외 합 니 다.
LinkedHashMap
링크 드 하 쉬 맵 은 하 쉬 맵 의 하위 클래스 로 하 쉬 맵 의 특성 을 계승 한 것 을 의미 하 며,이 외 에 도 링크 드 하 쉬 맵 은 삽입 순 서 를 저장 했다.
같은 코드 를 사용 한 다음 에 HashMap 을 LinkedHashMap 으로 바 꿉 니 다.다음 과 같 습 니 다.
package simplejava;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
class Dog {
String color;
Dog(String c) {
color = c;
}
public boolean equals(Object o) {
return ((Dog) o).color.equals(this.color);
}
public int hashCode() {
return color.length();
}
public String toString() {
return color + " dog";
}
}
public class Q26 {
public static void main(String[] args) {
Dog d1 = new Dog("red");
Dog d2 = new Dog("black");
Dog d3 = new Dog("white");
Dog d4 = new Dog("white");
LinkedHashMap<Dog, Integer> linkedHashMap = new LinkedHashMap<Dog, Integer>();
linkedHashMap.put(d1, 10);
linkedHashMap.put(d2, 15);
linkedHashMap.put(d3, 5);
linkedHashMap.put(d4, 20);
for (Entry<Dog, Integer> entry : linkedHashMap.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
출력 결과:red dog - 10
black dog - 15
white dog - 20
만약 우리 가 HashMap 을 사용한다 면 결 과 는 다음 과 같 습 니 다.삽입 순 서 를 저장 하지 않 은 것 과 차이 가 있 습 니 다.
red dog - 10
white dog - 20
black dog - 15
더 읽 기:ArrayList vs. LinkedList vs. Vector
링크
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 HashMap vs TreeMap vs Hashtable vs LinkedHashMap 에 관 한 지식 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[백준 1411] 비슷한 단어 (JAVA)원본 알파벳이 숌하게 바뀔 경우, 이를 HashMap을 이용해서 쌍으로 묶어준다. HashMap 사용법이 익숙하지 못 해서 어려웠던 문제이다. HashMap 사용법 30분 💬 투포인터 버전 참고...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.