引用分類和三個實現Map
阿新 • • 發佈:2018-12-17
一、引用分類
強引用:StrongReference:引用指向物件,gc(Garbage collection)執行時不回收
軟引用:SoftReference gc執行時可能回收(jvm記憶體不夠)
弱引用:WeakReference gc執行時立即回收
虛引用:PhantomReference 類似於無引用,主要跟蹤物件被回收的狀態,不能單獨使用,必須與引用佇列(ReferenceQueue)聯合使用
import java.lang.ref.WeakReference; /** * 引用分類:強、軟、弱、虛 * 強與弱的引用 */ public class RefTest { public static void main(String[] args){ String str="zhangrui";//常量池物件不會被回收 WeakReference weakReference=new WeakReference(str); System.out.println("回收前:"+weakReference.get()); //斷開引用 str=null; System.gc(); System.runFinalization(); System.out.println("回收後:"+weakReference.get()); System.out.println("***************************"); String str1=new String("zhangrui"); WeakReference weakReference2=new WeakReference(str1); System.out.println("回收前:"+weakReference2.get()); //斷開引用 str1=null; System.gc(); System.runFinalization(); System.out.println("回收後:"+weakReference2.get()); } }
二、三個Map介面實現
WeakHashMap
鍵為弱引用
/** * WeakHashMap的key為弱引用 */ import java.util.WeakHashMap; public class WeakHashMap1 { public static void main(String[] args){ WeakHashMap<String,String> map=new WeakHashMap<>(); //常量池物件,不會回收 map.put("a","zhang"); map.put("b","z"); //gc執行,已被回收 map.put(new String("ss"),"s"); map.put(new String("dd"),"d"); System.out.println(map.size()); //準備回收 System.gc(); System.runFinalization(); System.out.println(map.size()); } }
IdentityHashMap
鍵比較地址去重,注意常量池的物件
import java.util.IdentityHashMap; /** * IdentityHashMap 鍵比較地址去重 * 而HashMap比較key的hashcode和equals */ public class IdentityHashMap1 { public static void main(String[] args){ IdentityHashMap<String,String> map=new IdentityHashMap<>(); map.put("a","a1"); map.put("a","a2"); System.out.println(map.size());//IdentityHashMap只比較key的地址 map.put(new String("a2"),"aa"); map.put(new String("a2"),"bb"); System.out.println(map.size()); } }
EnumMap
列舉Map,要求鍵為列舉的值
import java.util.EnumMap;
/**
* EnumMap要求鍵為列舉
*/
public class EnumMap1 {
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());
}
}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}