자바 집합의 Hashtable

2907 단어
오늘 여러분 과 이 야 기 를 나 누 러 왔 습 니 다. HashTable 은 평소에 인 코딩 할 때 사용 하지 않 았 습 니 다. 기억 에 HashMap 과 같이 key - value 저장 을 했 고 데이터 구조 도 똑 같 습 니 다. 그러나 HashMap 은 스 레 드 가 안전 하지 않 습 니 다. HashTable 은 스 레 드 가 안전 합 니 다.오늘 우 리 는 그것 을 분석 해 보 겠 습 니 다. HashMap 과 비슷 하기 때문에 비교 해 보 겠 습 니 다.진짜 토 하고 싶 어: Hashtable 왜 HashTable [얼굴 가리 기] 아니 야?
공통점
  • HashMap 과 HashTable 데이터 구 조 는 일치 합 니 다.내 부 는 모두 Entry 의 배열 이다.
  • private static class Entry implements Map.Entry {
            int hash;
            final K key;
            V value;
            Entry next;
    
            protected Entry(int hash, K key, V value, Entry next) {
                this.hash = hash;
                this.key =  key;
                this.value = value;
                this.next = next;
            }
    }
    
  • 내부 구성원 변수 가 일치 합 니 다.loadFactor threshold modCount count (HashMap 의 수량 은 size 로 표시) 는 Hashtable 에 있 습 니 다.
  • HashMap 과 마찬가지 로 count > = threshold 일 때 확장 이 필요 합 니 다.
  • if (count >= threshold) {
         // Rehash the table if the threshold is exceeded
         rehash();
         ......
    }
    

    다른 점
  • Hashtable 초기 화 시 기본 용량 은 11 이 고 부하 인 자 는 0.75 이 며 초기 화 할 때 Entry 배열 로 신청 합 니 다.
  • public Hashtable() {
         this(11, 0.75f);
    }
    
    public Hashtable(int initialCapacity, float loadFactor) {
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            if (loadFactor <= 0 || Float.isNaN(loadFactor))
                throw new IllegalArgumentException("Illegal Load: "+loadFactor);
    
            if (initialCapacity==0)
                initialCapacity = 1;
            this.loadFactor = loadFactor;
            table = new Entry[initialCapacity];  //  table    
            threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
            initHashSeedAsNeeded(initialCapacity);
    }
    
  • HashMap 은 key 를 null 로 저장 할 수 있 는 경우, Hashtable 은 key 를 null 로 저장 할 수 없습니다.
  • 확장 메커니즘 이 다르다.HashMap 은 resize 할 때마다 용량 을 원래 의 2 배로 늘 리 고 Hashtable 은 원래 의 2 배 + 1 (홀수 보장)
  • 로 확대 합 니 다.
  • HashMap 은 라인 이 안전 하지 않다 (구체 적 인 원인 은 다음 과 같다.https://www.jianshu.com/p/c92e0e279243), Hashtable 은 라인 이 안전 합 니 다.실현 하 는 방식 은 방법 에 synchronized 자 물 쇠 를 추가 하 는 것 입 니 다. 다음 과 같 습 니 다.
  • public synchronized V get(Object key) {
            Entry tab[] = table;
            int hash = hash(key);
            int index = (hash & 0x7FFFFFFF) % tab.length;
            for (Entry e = tab[index] ; e != null ; e = e.next) {
                if ((e.hash == hash) && e.key.equals(key)) {
                    return e.value;
                }
            }
            return null;
        }
    

        Hashtable 이 제공 하 는 모든 방법 에 synchronized 자 물 쇠 를 추가 하 였 습 니 다.비록 스 레 드 안전 을 보장 하지만 우 리 는 모든 방법 에 이 동기 화 자 물 쇠 를 추가 하여 여러 번 병행 하 는 상황 에서 효율 이 매우 낮 다 는 것 을 발견 했다.

    좋은 웹페이지 즐겨찾기