1. 程式人生 > >Java基礎面試題10-Java 的引用型別有哪幾種

Java基礎面試題10-Java 的引用型別有哪幾種

Java四種引用型別 

1.引用的基本概念 
強引用:當我們使用new建立物件時,被建立的物件就是強引用,如Object object = new Object(),其中的object就是一個強引用了。如果一個物件具有強引用,JVM就不會去GC它,JVM寧可會報OOM來終止程式,也不回收該物件。 

軟引用: 如果一個物件只具備軟引用,如果記憶體空間足夠,那麼JVM就不會GC它,如果記憶體空間不足了,就會GC該物件。 

弱引用: 如果一個物件只具有弱引用,只要JVM的GC執行緒檢測到了,就會立即回收。弱引用的生命週期要比軟引用短很多。不過,如果垃圾回收器是一個優先順序很低的執行緒,也不一定會很快就會釋放掉軟引用的記憶體。 

虛引用:如果一個物件只具有虛引用,那麼它就和沒有任何引用一樣,隨時會被JVM當作垃圾進行GC。 

上面的四種引用對應的是new關鍵字以及java.lang.ref包中的SoftReference,WeakReference, PhantomReference。我們注意到在java.lang.ref包中,還存在一個類叫做ReferenceQueue。 

2.理解ReferenceQueue 
當軟引用物件被GC之後,雖然這個SoftReference物件指向的物件已不存在,但這個SoftReference物件本身還佔用記憶體,因此需要一個適當的清除機制,避免大量SoftReference物件帶來的OOM。這就需要用到ReferenceQueue。如果在建立SoftReference物件的時候,使用了一個ReferenceQueue物件作為引數提供給SoftReference的構造方法,如下例子: 

Java程式碼  收藏程式碼
  1. ReferenceQueue queue = new ReferenceQueue();  
  2. SoftReference ref=new SoftReference(new MyObject(), queue);  



那麼當這個SoftReference指向的MyOhject物件被垃圾收集器回收的同時,ref物件本身會被放入ReferenceQueue。也就是說,ReferenceQueue中儲存的物件是Reference物件,但這些Reference物件引用的物件已經不存在了。 

我們可以呼叫ReferenceQueue的poll()方法來檢查是否有它所關心的非強引用物件被回收。利用這個方法,我們可以檢查哪個SoftReference所軟引用的物件已經被回收。於是我們可以把這些失去軟引用的物件的清除掉。 


3.理解WeakHashMap 
WeakHashMap是以弱引用為鍵實現的HsahMap。更精確地說,對於一個給定的key物件,其對應的value物件的存在並不能阻止該key物件被GC。GC某個key物件時,它所在的條目會一併被從Map中刪除。這是WeakHashMap與其他HashMap最大的不同。看下面的例子: 

Java程式碼  收藏程式碼
    1. import java.util.Iterator;  
    2. import java.util.WeakHashMap;  
    3. public class Demo{  
    4.     public static void main(String [] args) throws Exception{  
    5.         WeakHashMap<String,String> weakHashMap=new WeakHashMap<String, String>();  
    6.         String [] sts=new String[10];  
    7.         for(int i=0;i<100;i++){  
    8.             if(i%10==0) {  
    9.                 sts[i/10]=new String(""+i);  
    10.                 weakHashMap.put(sts[i/10], new String(""+i));  
    11.             }  
    12.             else  
    13.                 weakHashMap.put(new String(""+i), new String(""+i));  
    14.         }  
    15.         // 催促垃圾回收器工作  
    16.         System.gc();  
    17.         // 把CPU讓給垃圾回收器執行緒  
    18.         Thread.sleep(8000);  
    19.         Iterator<String> iterator=weakHashMap.keySet().iterator();  
    20.         while(iterator.hasNext()){  
    21.             System.out.println(iterator.next());  
    22.         }  
    23.     }  
    24. }  

轉載:https://www.cnblogs.com/yaowen/p/6292984.html