美文网首页
Java: Java 引用类型

Java: Java 引用类型

作者: tylorsenna | 来源:发表于2019-05-20 17:00 被阅读0次

JAVA的引用类型

  1. 强引用(Strong Reference)
    强引用是指在程序代码中普遍存在的,类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
    只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象
  2. 软引用(Soft Reference)
    软引用是用来描述一些有用但并不是必需的对象。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。JDK 1.2之后,提供了SoftReference类来实现软引用。
import java.lang.ref.SoftReference;
public class Main {
    public static void main(String[] args) {
        SoftReference<String> sr = new SoftReference<String>(new String("hello"));
        System.out.println(sr.get());
    }
}

3.弱引用(WeakReference)
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象

import java.lang.ref.WeakReference;
public class Main {
    public static void main(String[] args) {
        WeakReference<String> sr = new WeakReference<String>(new String("hello"));
        System.out.println(sr.get());
        System.gc();                //通知JVM的gc进行垃圾回收
        System.out.println(sr.get());
    }
}
输出结果
hello
null

4.虚引用(PhantomReference)
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class Main {
    public static void main(String[] args) {
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
        PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
        System.out.println(pr.get());
    }
}   

总结对比

引用类型: 强引用 软引用 弱引用 虚引用
引用强度: 最强 第二 第三 最弱
如何使用: new Object() SoftReference WeakReference PhantomReference

在Android中的使用场景

  1. Handler 弱引用,防止内存泄漏
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import java.lang.ref.WeakReference;
 
public class MainActivity extends AppCompatActivity {
 
    private Handler handler  ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        handler = new MyHandler( this ) ;
 
        new Thread(new Runnable() {
            @Override
            public void run() {
               handler.sendEmptyMessage( 0 ) ;
            }
        }).start() ;
 
    }
 
    private static class MyHandler extends Handler {
        WeakReference<MainActivity> weakReference ;
 
        public MyHandler(MainActivity activity ){
            weakReference  = new WeakReference<MainActivity>( activity) ;
        }
 
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if ( weakReference.get() != null ){
                // update android ui
            }
        }
    }
 
}
  1. Bitmap软引用防止OOM
    下面这段代码是摘自博客:
    http://blog.csdn.net/arui319/article/details/8489451
    private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
public void addBitmapToCache(String path) {
// 强引用的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 软引用的Bitmap对象
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
// 添加该对象到Map中使其缓存
imageCache.put(path, softBitmap);
}
public Bitmap getBitmapByPath(String path) {
// 从缓存中取软引用的Bitmap对象
SoftReference<Bitmap> softBitmap = imageCache.get(path);
// 判断是否存在软引用
if (softBitmap == null) {
return null;
}
// 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空
Bitmap bitmap = softBitmap.get();
return bitmap;
}

作者:Allens_Jiang
链接:https://www.jianshu.com/p/e66d03c3e614
来源:简书

相关文章

  • Android内存

    Java引用类型 Java数据类型分为基本数据类型(如 int, byte)、引用数据类型(如 String),基...

  • Glide弱引用缓存与java的强引用、软引用、弱引用、幻象引用

    java的强引用、软引用、弱引用、幻象引用,引用队列总结 java除了原始数据类型的变量,其他所有都是引用类型。 ...

  • 面试题笔记

    Java中引用类型的区别,具体的使用场景 Java中引用类型分为四类:强引用、软引用、弱引用、虚引用。 强引用:强...

  • 一文读懂java中的Reference和引用类型

    一文读懂java中的Reference和引用类型 简介 java中有值类型也有引用类型,引用类型一般是针对于jav...

  • Java核心知识点(二)

    Java面向对象基本概念——引用 Java语言中除基本类型之外的变量类型都称之为引用类型 Java中的对象是通过引...

  • Java中的四种引用类型

    一、Java中的四种引用类型 JDK 1.2 开始 Java 提供了四种引用类型,分别是强引用、软引用、弱引用、虚...

  • Java基础知识总结(上)

    Java中的数据类型 Java的数据类型分为两大类:基本类型和引用类型 引用类型:引用类型指向一个对象,不是原始值...

  • 金山电面总结

    1 java引用类型 4种引用类型:强引用(StrongReference),软引用(SoftReference...

  • 我赌你不懂系列:Java的引用类型都有哪几种

    引用类型 今天看代码看到有牵扯到弱引用的东西,就先稍微补一补Java的四种引用类型吧。 Java为引用类型专门定义...

  • JAVA之引用类型

    java中数据类型分为基本数据类型和引用数据类型。 1、引用数据类型 java中的数据类型分为基本数据类型和引用数...

网友评论

      本文标题:Java: Java 引用类型

      本文链接:https://www.haomeiwen.com/subject/cotlzqtx.html