WeakHashMap,IdentityHashMap,EnumMap

6825 단어 mapJavaSE
WeakHashMap 클래스는 Map 커넥터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로 설정되면 오류가 발생할 수 있습니다.

좋은 웹페이지 즐겨찾기