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

Java面试问题之二十三

阅读更多
请问Java中的引用分为哪几种级别?这几种级别之间都有些什么区别?

答:为了使程序更灵活地控制对象的生命周期,在JDK1.2版本之后,把对象的引用分为4种级别。这4种级别由高到底分别为:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)。它们有其各自的特点和使用场合。

1、强引用:这种引用是最普遍的引用,如果一个对象具有强引用,垃圾回收器绝对不会对这样的对象进行回收。尽管在内存严重不足的时候,Java虚拟机宁愿抛出OutOfMemoryError错误,使异常程序异常终止,也不会随便回收具有强引用的对象占用的资源来解决内存不足的问题。

2、软引用:如果一个对象只具有软引用,那么它就像日常生活中那些可有可无的生活用品。如果内存空间不足时,垃圾回收器就会对这样的对象进行回收;相反,如果内存空间还充足时,垃圾回收器不会对具有软引用对象所占用的资源进行回收。软引用可以用来实现内存敏感的高速缓存。

3、弱引用:如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

4、虚引用:“虚引用”顾名思义,就是形同虚设,与其他几种引用都不一样,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用是一样的,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备一个对象时,如果发现它还有虚引用,就会在回收该对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用对象中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。


此外,在java.lang.ref包中提供了三个类——SoftReference类、WeakReference类和PhantomReference类,它们分别代表软引用、弱引用和虚引用。而ReferenceQueue类表示引用队列,它可以和这三种引用类型联合使用,以便跟踪Java虚拟机回收所引用的对象的活动。使用弱引用的一个例子如下所示:



String str = new String("hello");
ReferenceQueue<String> rq = new ReferenceQueue<String>();
WeakReference<String> wf = new WeakReference<String>(str,rq);

str = null;
String str1 = wf.get();    //如果“hello”对象没有被回收,str1引用“hello”对象

//如果“hello”对象没有被回收,rq.poll()返回null
Reference<? extends String> ref = rq.poll();  





分享到:
评论

相关推荐

    java 面试 java 面试 java 面试

    java 面试java 面试java 面试java 面试java 面试

    日语java面试问题集

    【标题】:“日语java面试问题集”揭示了在针对日本客户的Java外包项目中,面试者可能遇到的技术和语言双重要求。这类面试通常旨在测试应聘者的Java编程基础、问题解决能力,以及与日本客户沟通的技能。 【描述】:...

    JAVA面试资料JAVA面试资料 JAVA面试资料 JAVA面试资料

    JAVA面试资料JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA...

    JAVA面试问题,自己和别人总结

    JAVA面试问题总结 JAVA是一种广泛应用的编程语言,作为一名JAVA开发者,需要具备扎实的基础知识和实践经验。本文总结了常见的JAVA面试问题,涵盖了JAVA基础、JSP、Servlet、XML、J2EE、MVC、数据库等方面的知识点。...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....

    2023黑马面试宝典-Java面试宝典大全-java面试宝典黑马

    Java面试宝典是Java程序员求职面试的重要参考资料,它涵盖了Java编程语言的核心概念、高级特性、设计模式、并发处理、框架应用、数据库交互等多个方面。以下将详细解析这些关键知识点: 1. **Java基础**:面试中,...

    Java 面试问题英文版

    常见Java面试问题,里面涵盖了基础的Java面试问题,有助于准备面试

    java面试宝典2018版

    《Java面试宝典2018版》是针对Java开发者准备面试的重要参考资料,它涵盖了Java编程语言、Java虚拟机(JVM)、并发编程、框架、设计模式等多个关键领域的重要知识点。这本书旨在帮助Java程序员深入理解技术原理,...

    Java面试题2022

    在准备2022年的Java面试时,了解和掌握关键知识点是至关重要的。Java作为一款广泛应用的后端开发语言,其面试通常会涵盖基础语法、面向对象编程、集合框架、多线程、JVM内存管理、数据库交互以及开源框架等方面。...

    2023最新JAVA面试题集

    最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 35道 BTA 常问的 Java基础39道常见面试题及详细答案 Dubbo面试题 47道 ElasticSearch面试题 30道 Git常用命令面试题 60道 Java并发...

    2024 Java面试宝典合集

    9. **头条java面试题**:这个可能是特定平台或公司对Java开发者的技术要求,可能包含更具体的热点问题和技术趋势。 10. **2024 Java offer 收割指南**:这份指南可能提供求职策略、面试技巧、简历优化建议,帮助...

    Java面试宝典和2018Bat公司面试题

    本资源包"Java面试宝典和2018Bat公司面试题"包含了针对Java程序员精心整理的面试资料,旨在帮助求职者全面了解并掌握Java技术的核心知识点,以及在BAT(百度、阿里巴巴、腾讯)等知名互联网公司面试中可能遇到的问题...

    Java面试题大全(整理版)1000+面试题 (面试准备+Java基础+高级特性+常见问题+答案解析)

    总的来说,准备Java面试时,你需要深入理解这些技术的原理、应用场景和最佳实践,结合实际项目经验进行回答,才能在面试中展现出专业水平。通过这份1000+面试题的资源,你可以系统地复习并测试自己的知识深度,提升...

    Java技术面试常见问题

    从数据结构,到开发设计模式,再到java基础详细讲述java面试常见问题,让你面试轻松过关,并且懂得面试技巧,增加自身基础知识

    JAVA面试宝典.pdf

    《JAVA面试宝典》是一本全面涵盖Java技术体系和求职面试知识的指南,旨在帮助Java开发者准备面试,提升技能。本书共分为十章,从基础知识到框架应用,再到项目实战和面试题解析,覆盖了Java开发者的必备技能。 第一...

    Java面试汇总.pdf+总结全面+八股文

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Java 高频面试题。...

    java面试宝典2017版

    Java面试宝典2017版是一份集大成的面试资源,专为准备Java相关...通过深入理解和熟练掌握上述知识点,你可以更好地应对Java面试,展现出扎实的技术功底和解决问题的能力。不断学习和实践,是成为优秀Java开发者的关键。

    10万字总结java面试题和答案(八股文之一)Java面试题指南

    JavaOOP面试题 Java集合/泛型面试题 Java异常面试题 Java中的IO与NIO面试题 Java反射面试题 Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 ...

Global site tag (gtag.js) - Google Analytics