Java -- WeakHashMap
5953 단어 WeakHashMap
자바 의 인용 유형 은 네 가지 상황 으로 강 인용,소프트 인용,약 인용,허 인용 이다.이런 것들 에 관 한 소 개 는 소인 의 또 다른 박문 을 참고 할 수 있 습 니 다. http://www.cnblogs.com/plxx/p/4217178.html
개술
Weak Hash Map,가족 과 Hash Map 은 동년배 입 니 다.
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
WeakHashMap---An entry in a WeakHashMap will automation be remove when its key is no longer in ordinary use.key 를 더 이상 사용 하지 않 을 때 자동 으로 삭 제 됩 니 다.더 이상 사용 하지 않 는 것 은 어떤 상태 입 니까??GC 루트 가 매 거 지지 않 을 때 는 GC(finalizable-->finalized-->reclaimed참고 하 다)에 의 해 이 럴 수 있다 고 생각 합 니 다.
HashMap 과 마찬가지 로 Weak HashMap 은
Once such a key is discarded it can never be recreated, so it is impossible to do a lookup of that key
in a WeakHashMap at some later time and be surprised that its entry has been removed.
Key 가 삭제 되면 다시 만 들 수 없고,조회 하면 나중에 entry 가 삭 제 됩 니 다.
Each key object in a WeakHashMap is stored indirectly as the referent of a weak reference.
value objects do not strongly refer to their own keys, either directly or indirectly,
since that will prevent the keys from being discarded
그 중의 key 는 weak reference 를 저장 합 니 다.value 에 저 장 된 것 은 strong reference 입 니 다.value 는 직접적 이거 나 간접 적 으로 key 와 연결 되 지 않 으 면 key 의 제 거 를 막 을 수 있 습 니 다.
3.소스 코드 보기
1 private void expungeStaleEntries() {
2 for (Object x; (x = queue.poll()) != null; ) {
3 synchronized (queue) { // 4 @SuppressWarnings("unchecked")
5 Entry<K,V> e = (Entry<K,V>) x;
6 int i = indexFor(e.hash, table.length);
7
8 Entry<K,V> prev = table[i]; // 9 Entry<K,V> p = prev;
// 10 while (p != null) {
11 Entry<K,V> next = p.next;
12 if (p == e) {
13 if (prev == e)
14 table[i] = next;
15 else
16 prev.next = next;
17 // Must not null out e.next;
18 // stale entries may be in use by a HashIterator
19 e.value = null; // Help GC
20 size--;
21 break;
22 }
// -- 23 prev = p;
24 p = next;
25 }
26 }
27 }
28 }
expunge - Stale - Entries 오래된 실체 지우 기
resize(),size(),getTables()와 관련 된 작업 에서 이 방법 을 호출 합 니 다.사용 하지 않 는 대상 을 모두 지 웁 니 다.