`
YuHuang.Neil
  • 浏览: 187533 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中软引用、弱引用和虚引用的使用方法示例

阅读更多
在Java引用中,使用最多的无疑是强引用类型,对于其余三种级别的引用类型用得比较少。它们使用的方式与强引用也有些区别。下面使用一个例子来介绍一下其余三种引用(包括软引用、弱引用和虚引用)的使用方法。


import java.lang.ref.*;
import java.util.*;

class Grocery {
        private static final int SIZE=10000;
        private double[] d = new double[SIZE];
        private String id;

        public Grocery(String id) {
                this.id = id;
        }

        public String toString(){
                return id;
        }

        public void finalize(){
                System.out.println("Finalizing ... "+id);
        }

}

public class References {
        private static ReferenceQueue<Grocery> rq = new ReferenceQueue<Grocery>();

        public static void checkQueue(){
                Reference<? extends Grocery> inq = rq.poll();
                if(inq!=null){
                        System.out.println("In queue : "+inq.get());
                }
        }

        public static void main(String[] args){
                final int size = 10;
                Set<SoftReference<Grocery>> sa = new HashSet<SoftReference<Grocery>>();

                for(int i=0;i<size;i++){
                        SoftReference<Grocery> ref =
                                new SoftReference<Grocery>(new Grocery("Soft "+i),rq);
                        System.out.println("Just created: "+ref.get());
                        sa.add(ref);
                }

                System.gc();
                checkQueue();

                Set<WeakReference<Grocery>> wa = new HashSet<WeakReference<Grocery>>();

                for(int i=0;i<size;i++){
                        WeakReference<Grocery> ref =
                                        new WeakReference<Grocery>(new Grocery("Weak "+i),rq);
                        System.out.println("Just created: "+ref.get());
                        wa.add(ref);
                }

                System.gc();
                checkQueue();

                Set<PhantomReference<Grocery>> pa = new HashSet<PhantomReference<Grocery>>();

                for(int i=0;i<size;i++) {
                        PhantomReference<Grocery> ref =
                                new PhantomReference<Grocery>(new Grocery("Phantom "+i),rq);
                        System.out.println("Just created: "+ref.get());
                        pa.add(ref);
                }

                System.gc();
                checkQueue();
        }
}






在上面的程序中,References类依次创建了10个软引用、10个弱引用和10个虚引用,它们各自引用一个Grocery对象。下面是运行结果:

Lab-Computer-0db2f6:JavaExercises labuser$ javac References.java
Lab-Computer-0db2f6:JavaExercises labuser$ java References
Just created: Soft 0
Just created: Soft 1
Just created: Soft 2
Just created: Soft 3
Just created: Soft 4
Just created: Soft 5
Just created: Soft 6
Just created: Soft 7
Just created: Soft 8
Just created: Soft 9
Just created: Weak 0
Just created: Weak 1
Just created: Weak 2
Just created: Weak 3
Just created: Weak 4
Just created: Weak 5
Just created: Weak 6
Just created: Weak 7
Just created: Weak 8
Just created: Weak 9
Just created: null
Just created: null
Just created: null
Just created: null
Just created: null
Just created: null
Just created: null
Just created: null
Just created: null
Just created: null
Finalizing ... Weak 9
Finalizing ... Weak 8
Finalizing ... Weak 7
Finalizing ... Weak 6
Finalizing ... Weak 5
Finalizing ... Weak 4
Finalizing ... Weak 3
Finalizing ... Weak 2
Finalizing ... Weak 1
Finalizing ... Weak 0
Finalizing ... Phantom 9
Finalizing ... Phantom 8
Finalizing ... Phantom 7
Finalizing ... Phantom 6
Finalizing ... Phantom 5
Finalizing ... Phantom 4
Finalizing ... Phantom 3
Finalizing ... Phantom 2
Finalizing ... Phantom 1
Finalizing ... Phantom 0


从程序运行结果可以看出,虚引用形同虚设,它所引用的对象随时可能被垃圾回收器回收,具有弱引用的对象拥有稍微长一点的生命周期,当垃圾回收器执行回收操作时,有可能被垃圾回收器回收,具有软引用的对象拥有更长的生命周期,但在Java虚拟机认为内存不足的情况下,也是会被垃圾回收器回收的。






分享到:
评论

相关推荐

    Java中软国际餐厅到店点餐系统源码.zip

    总的来说,这个Java中软国际餐厅到店点餐系统涵盖了Java语言的多个核心技术和框架,从后端业务逻辑处理到前端展示,再到数据库交互和并发控制,展现了Java在构建大型企业级应用中的强大能力。通过学习和研究这个源码...

    推荐完整精品Java教程 中软国际Java培训课件 Java核心技术全套PPT课程 共22个章节.rar

    推荐完整精品Java教程 中软国际Java培训课件 Java核心技术全套课程 05-类和对象(共56页).ppt 推荐完整精品Java教程 中软国际Java培训课件 Java核心技术全套课程 06-OOP封装(共36页).ppt 推荐完整精品Java教程 ...

    中软国际java基础

    《中软国际java基础》是2009年中软国际为java方向的培训提供的一套基础教材,主要涵盖了Java编程语言的核心概念和技术。作为一套入门级别的教程,它旨在帮助初学者建立坚实的Java编程基础,为未来深入学习和开发Java...

    中软国际Java面试题

    - 数据类型:Java分为基本数据类型(如int、char)和引用数据类型(如类、接口、数组)。理解它们的区别以及各自的大小和范围。 - 变量与常量:学习如何声明、初始化和使用变量,以及常量的定义。 - 运算符:理解...

    JAVA中软面试题

    - **对象创建与引用**:题目十四和十五深入探讨了JAVA中对象的创建方式以及引用的管理。 - **JSP隐含对象**:题目十六提到了JSP页面中可用的隐含对象,如`out`、`request`、`response`等,这些对象简化了页面的开发...

    android中软引用的使用测试

    所以开始做应用的时候并没有考虑这些,所以后来痛苦了好久,现在和大家分享一些关于让你的程序稳定程度加一成保障的做法,那就是在程序中SoftReference的使用,可能大家并没有确切的去做过这个软引用的实际使用与不...

    中软国际Java培训

    中软国际Java培训,关于api基础的课件,有例子

    2020年中软国际-Java中级.pdf

    在 Java 中,有两种方式来比较对象的相等性,一种是使用 == 运算符,另一种是使用 equals() 方法。== 运算符比较的是对象的内存地址,而 equals() 方法比较的是对象的内容。 在 Java 中,每个对象都有一个 hashCode...

    中软国际Java程序员机试题

    Java 程序员机试题是中软国际为招聘Java程序员所设计的一种机试题,旨在考察应聘者的Java编程能力和软件开发能力。该机试题要求应聘者在Eclipse开发环境和Tomcat应用服务器上,使用JAVA技术并采用MVC模式实现用户...

    中软国际Java程序员笔试题及答案JAVA语言

    中软国际Java程序员笔试题及答案

    中软国际软件测试培训java课件

    Java使用try-catch-finally语句块来捕获和处理异常,保证程序的健壮性。同时,我们还将学习集合框架,包括ArrayList、LinkedList、HashMap等容器的使用,它们在存储和操作数据时发挥着重要作用。 对于软件测试人员...

    中软java聊天工具

    《中软Java聊天工具:Swing技术在C/S架构下的应用》 在信息技术日新月异的今天,各种通信工具层出不穷,其中Java语言凭借其跨平台的优势,常被用于开发各种客户端应用程序,如我们今天要讨论的“中软Java聊天工具”...

    中软JAVA面试宝典面试题

    23. Java 中通过方法的重写(Override)和多态性实现多态。 24. `abstractclass` 可以包含方法实现,而 `interface` 中所有方法默认都是抽象的,不能有实现。`abstractclass` 可以有构造器、实例变量和非抽象方法,...

    java中软项目物流管理系统源码整个项目的流程

    总的来说,"java中软项目物流管理系统源码整个项目的流程"涵盖了一系列IT专业技能,包括需求分析、设计、编码、测试和部署,这些知识点对于理解完整的软件开发过程至关重要,同时也为开发者提供了实际操作的经验。

    JAVA中软面试题.pdf

    1. 对象比较问题:在JAVA中,对象比较有多种方式,包括使用equals()方法、hashCode()方法、toString()方法等。在集合操作中,正确的比较方式至关重要。 2. 集合框架:JAVA中的集合框架包括List、Set、Map等,各个...

    中软培训java教材

    ### 中软培训Java教材知识点概览 #### 一、Java技术概述 - **Java的诞生与发展** - **创始人**:James Gosling于1991年4月领导的绿色计划(Green Project)中开始了Java的研发工作。 - **名称演变**:最初命名为...

    华为,中软等大公司JAVA面试试题

    本压缩包文件“大公司JAVA面试试题”包含了华为和中软等知名企业的Java面试题目,旨在帮助应聘者了解并准备这些公司可能面临的挑战。 【描述】:“pdf文件 华为,中软等大公司JAVA面试试题” 这个PDF文档集成了华为...

    深圳中软资源技术服务有限公司JAVA面试题目

    - **字符串分割**: 在Java中可以使用`split()`方法来分割字符串。例如,可以通过指定数字字符作为分隔符来实现题目中的需求。 - **字符串截取**: 使用`substring()`方法可以从原字符串中截取出部分子串。需要注意的...

    中软公司--JAVA培训资料

    除了理论知识,中软公司JAVA培训资料还提供了大量的实践案例,包括数据库操作、Web应用开发、网络通信等场景下的具体代码示例。通过这些案例,学员可以更好地理解如何将理论知识应用于实际项目中,提升解决复杂问题...

Global site tag (gtag.js) - Google Analytics