Java的四种引用源代码例子

Java的四种引用源代码例子

不解释,直接上代码,千言万语顶不住一行代码。

package com.apkkids.javalanguage;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;

/**
 * @author wxb
 * Java的四种引用
 * 强引用:拥有强引用的对象无论何时都不会被垃圾回收
 * 软引用:只拥有软引用的对象当内存不足时,会被垃圾回收
 * 弱引用:只拥有弱引用的对象会在垃圾收集运行时被回收
 * 虚引用:只拥有虚引用的对象和没有引用一样,只不过它被垃圾回收时会被放入关联的引用队列,并可被观察到
 *
 */
public class FourReferenceTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //三个测试,测试其中一个时请注释掉其他两个
        PhatomReferenceTest();
//      WeakReferenceTest();
//      SoftReferenceTest();
    }

    static void PhatomReferenceTest(){
        String s = new String("abc");
        //创建一个引用队列rq,然后用rq和s一起创建一个虚引用
        final ReferenceQueue<String> rq = new ReferenceQueue<String>();
        PhantomReference<String> wr = new PhantomReference<String>(s,rq);  //wr.get()会永远返回null
        s = null;
        //创建一个线程来循环检测s是否加入了队列
        new Thread(){
            boolean bFlag = true;
            @Override
            public void run() {
                Object obj = null;

                while(bFlag){
                    obj = rq.poll();  //rq中终会poll出一个PhantomReference
                    if(obj != null){
                        bFlag = false;
                        try {
                            //使用反射的原因是PhantomReference的get方法始终返回null
                            //即使向上转型为Reference也不行,因此只能通过反射直接得到存储在Reference类中的referent
                            Field f = Reference.class.getDeclaredField("referent");
                            f.setAccessible(true);
                            String s = (String) f.get(obj);
                            System.out.println("get String from PhantomReference :"+s);
                        } catch (NoSuchFieldException e) {
                            e.printStackTrace();
                        } catch (SecurityException e) {
                            e.printStackTrace();
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }

                    }
                }
            }
        }.start();

        try {
            //主线程休眠后运行gc,等待子线程运行
            Thread.sleep(1000);
            System.gc();
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }   
    }

    static void WeakReferenceTest(){
        String s = new String("abc");
        WeakReference<String> wr = new WeakReference<String>(s);
        s = null;
        while(wr.get() != null){
            System.out.println("WeakReference get :"+wr.get());
            System.gc();
            System.out.println("System.gc()");
        }

    }

    /**
     * 不到内存耗尽该测试不会退出
     */
    static void SoftReferenceTest(){
        String s = new String("abc");
        SoftReference<String> wr = new SoftReference<String>(s);
        s = null;
        while(wr.get() != null){
            System.out.println("SoftReference get :"+wr.get());
            System.gc();
            System.out.println("System.gc()");
        }
    }

}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
第一篇 基础知识篇 实例1 数据类型转换 实例2 转义字符 实例3 关系和逻辑运算 实例4 自增自减 实例5 普通位运算 实例6 位移运算 实例7 字符译码 实例8 指针操作符 实例9 if判断语句 实例10 else-if语句 实例11 嵌套if语句 实例12 switch语句 实例13 for语句 实例14 while语句 实例15 do-while语句 实例16 break和continue语句 // 实例17 exit()语句 // 实例18 综合实例 实例19 一维数组 实例20 二维数组 实例21 字符数组 // 实例22 数组初始化 // 实例23 数组应用 实例24 函数的值调用 实例25 函数的引用调用 //swap 实例26 数组函数的调用 // 实例27 命令行变元 // 实例28 函数的返回值 实例29 函数的嵌套调用 实例30 函数的递归调用 实例31 局部和全局变量 实例32 变量的存储类别 实例33 内部和外部函数 实例34 综合实例1 实例35 综合实例2 实例36 变量的指针 实例37 一维数组指针 实例38 二维数组指针 实例39 字符串指针 实例40 函数指针 实例41 指针数组 实例42 二维指针 实例43 指针的初始化 实例44 综合实例 第二篇 深入提高篇 实例45 结构体变量 实例46 结构体数组 实例47 结构体指针变量 实例48 结构体指针数组 实例49 共用体变量 实例50 枚举类型 实例51 读写字符 实例52 读写字符串 实例53 格式化输出函数 实例54 格式化输入函数 实例55 打开和关闭文件 实例56 fputc()和fgetc() 实例57 函数rewind() 实例58 fread()和fwrite() 实例59 fprintf()和fscanf() 实例60 随机存取 实例61 错误处理 实例62 综合实例 实例63 动态分配函数 实例64 常用时间函数 实例65 转换函数 实例66 查找函数 实例67 跳转函数 实例68 排序函数 实例69 伪随机数生成 实例70 可变数目变元 第三篇 常用算法篇 实例71 链表的建立 实例72 链表的基本操作 实例73 队列的应用 实例74 堆栈的应用 实例75 串的应用 实例76 树的基本操作 实例77 冒泡排序法 实例78 堆排序 实例79 归并排序 实例80 磁盘文件排序 实例81 顺序查找 实例82 二分法查找 实例83 树的动态查找 实例84 二分法求解方程 实例85 牛顿迭代法求解方程 实例86 弦截法求解方程 实例87 拉格朗日插值 // 实例88 最小二乘法拟合 ?? 实例89 辛普生数值积分 实例90 改进欧拉法 实例91 龙格-库塔法 实例92 高斯消去法 实例93 正定矩阵求逆 第四篇 综合应用篇 实例94 用C语言实现遗传算法 实例95 人工神经网络的C语言实现 实例96 K_均值算法 实例97 ISODATA算法 实例98 快速傅立叶变换 实例99 求解野人与传教士问题 实例100 简单专家系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值