和C++不同,Java没有用指针,用的是引用,Java有4种引用分别是 强引用,软引用,弱引用,虚引用
- 强引用
强引用是代码中常用的引用,new出来的这类,只要强引用在,GC永远不会回收它
例:
Object obj =new Object();
- 软引用
用来描述一些还有用但并非必须的对象。软引用在系统将要发生内存溢出异常前将会触发回收。软引用实现类是SoftReference
例:
String key="test";
Map<String, SoftReference<Object>> map=new HashMap<String, SoftReference<Object>>();
SoftReference<Object> reference=map.get(key);
Object result="hello world";
if(reference==null){
reference=new SoftReference<Object>(result);
map.put(key, reference);
}
result=reference.get();
System.out.println(result.toString()); - 弱引用
也是用来描述非必须对象的,但是它的强度比软引用更弱一些,弱引用关联的对象生存到下一次垃圾回收之前。垃圾回收时,无论内存是否足够都将回收掉。弱引用实现类是WeakReference
例:
String key="test";
Map<String, WeakReference<Object>> map=new HashMap<String, WeakReference<Object>>();
WeakReference<Object> reference=map.get(key);
Object result="hello world";
if(reference==null){
reference=new WeakReference<Object>(result);
map.put(key, reference);
}
result=reference.get();
System.out.println(result.toString()); - 虚引用
他是最弱的一种引用。一个对象是否有虚引用的存在,安全不会对其生存时间构成影响,也无法通过虚引用取得一个对象实例。对象设置虚引用关联的唯一目的就是为了能在对象被GC回收时收到一个系统通知。虚引用实现类是PhantomReference
例
String key="test";
Map<String, PhantomReference<Object>> map=new HashMap<String, PhantomReference<Object>>();
Object result="hello world";
PhantomReference<Object> reference=new PhantomReference<Object>(result, null);
map.put(key, reference);