WeakHashMap,IdentityHashMap,EnumMap
public class WeakHashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>
를 지원합니다.다른 맵 구현 클래스와 달리 WeakHashMap 클래스의 키 대상은 간접적으로 약한 인용의 지시 대상으로 저장되며, 키가 정상적으로 사용되지 않을 때 자동으로 항목을 제거합니다.더 정확히 말하면, 주어진 키에 대한 비추는 존재는 스팸 수거기가 이 키를 버리는 것을 막지 않는다. 그러면 이 키는 중지할 수 있고, 중지되고, 회수된다.키를 버리면 해당 항목이 맵에서 효과적으로 제거됩니다.
인용의 분류: 1.StrongReference 강력 인용, 인용은 대상을 가리키며 gc가 실행될 때 회수하지 않습니다.SoftReference 소프트 인용, gc가 실행될 때 회수할 수 있습니다. 예를 들어 jvm 메모리가 부족할 때 회수합니다.WeakReference 약한 참조, gc 실행 시 즉시 회수 4.PhantomReference 허위 인용, 인용이 없는 것과 유사하며, 주요 추적 대상이 회수된 상태입니다. 단독으로 사용할 수 없습니다. 인용 대기열 (Reference Queue) 과 함께 사용해야 합니다.
약한 인용을 소개합니다. gc를 호출할 때 gc는 대상을 회수합니다. 주의해야 할 것은 상수 문자열을 회수하지 않습니다. 상수 탱크에 공유되어 있기 때문에 인용 gc를 끊어도 삭제하지 않습니다. 코드 참조:
import java.lang.ref.WeakReference;
public class Test {
public static void main(String[] args){
//
String str="hello world";
WeakReference<String> wr=new WeakReference<String>(str);
//
str=null;
// gc
System.gc();
System.runFinalization();
System.out.println(wr.get());
}
}
출력 결과는 Hello World입니다.
import java.lang.ref.WeakReference;
public class Test {
public static void main(String[] args){
//String
String str2=new String("hello again");
WeakReference<String> wr=new WeakReference<String>(str2);
str2=null;
System.gc();
System.runFinalization();
System.out.println(wr.get());
}
}
출력 결과는null
WeakHashMap 클래스
import java.util.WeakHashMap;
public class Test {
public static void main(String[] args){
WeakHashMap<String,String> map=new WeakHashMap<String,String>();
//
map.put("1", "abc");
map.put(new String("2"), "qaz");
System.out.println(map.size());// 2
//
System.gc();
System.runFinalization();
System.out.println(map.size());// 1
}
}
new String ("2") 이 키 값과 대응하는value 값이 삭제되었기 때문에 맵입니다.크기()는 1입니다.
WeakHashMap의 장점은 바로 여기에 있다. 만약에 HashMap의 데이터가 매우 크고 대량의 메모리를 차지한다면 gc가 실행될 때 이 메모리를 정리할 수 있기를 바란다. WeakHashMap을 사용할 수 있지만 Map의 다른 실현 클래스는 이 점을 실현할 수 없다.
IdentityHashMap 클래스와 같이 해시 테이블을 이용하여 Map 인터페이스를 실현하고 키(및 값)를 비교할 때 인용의 상등성을 사용하여 대상의 상등성을 대체한다.즉, IdentityHashMap에서 (k1=k2)만 있을 때 두 키 k1과 k2가 같다고 생각하고 정상적인 맵 실현 클래스(예를 들어 HashMap)에서 다음 조건이 충족될 때만 두 키 k1과 k2가 같다고 생각한다. (k1=null?k2==null:e1.equals(e2))
import java.util.IdentityHashMap;
public class Test {
public static void main(String[] args){
IdentityHashMap<String,String> map=new IdentityHashMap<String,String>();
map.put("a", "qaz");
map.put("a", "wsx");
System.out.println(map.size());// 1
map.put(new String("a"), "edc");
map.put(new String("a"), "rfv");
System.out.println(map.size());// 3
}
}
여기의 문자열 상수 'a' 는 같은 메모리 주소이기 때문에 키는 같지만, 매번 new String ('a') 마다 새로운String 대상을 만들고, 새로운 메모리 주소를 개척하기 때문에 다른 키입니다.
EnumMap 클래스 EnumMap에는 키 값이 열거 유형이어야 하며, 열거는 상수의 집합이어야 합니다.
import java.util.EnumMap;
public class Test {
public static void main(String[] args){
EnumMap<Season,String> map=new EnumMap<Season,String>(Season.class);
map.put(Season.SPRING, " ");
map.put(Season.SUMMER, " ");
map.put(Season.AUTUMN, " ");
map.put(Season.WINTER, " ");
System.out.println(map.size());// 4
}
}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}
EnumMap의 키 값은 다른 것이 될 수 없습니다. 예를 들어 제 범주가 Integer로 설정되면 오류가 발생할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React Native Mapbox(v10) 설치이 글에서는 React Native에서 지도를 통합하기 위한 도구로 Mapbox(v10)를 사용하는 기본 사항에 대해 알아봅니다. 나는 iOS와 Android 모두에서 완벽하게 작동하는 mapbox를 선호합니다. "...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.