HashMap vs TreeMap vs Hashtable vs LinkedHashMap

Map 은 중요 한 데이터 구조 로 이 글 은 HashMap,TreeMap,HashTable,LinkedHashMap 등 서로 다른 Map 을 어떻게 사용 하 는 지 소개 할 것 이다.
지도 개관

자바 에는 네 가지 흔히 볼 수 있 는 맵 이 있 습 니 다.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 에 관 한 지식 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기