`

是否需要设置obj = null

JVM 
阅读更多

虽然是C#技术栏目,但对JAVA完全适用。

但所以答案没有一个是正确且完整的。

下面是我的答案,我有足够的自信说这是真正正确的答案,除非JVM和CLR规范重新修改了。

正常情况下生成一个对象后主动让 obj = null; 
没有任何作用,但也没有任何害处(除了说明程序员对编译器的无知和代码看起来比较幼稚) 
编译器比你更清楚在什么位置对象已经失去引用。 

object o = new object(); 
stmt1; 
o.xxx(); 
stmt2; 
stmt3; 
o = null; 

其实编译器在为o.xxx()后面就知道它(原来o指向的那个对象)是可回收的, 
比你在两个语句后再o=null更准确! 

什么时候需要 o = null;? 
o = null;有时是必须的,就是在底层容器中保存对象然后外部封装类pop出来的时候。 

比如一个Queue,它的实现是用一个成员变量数组来保存对象 


class MyQueue{ 
  private object[] arr = new object[100]; 
  private int tail; 
  private int head; 
  private int count; 
  ............; 


当压入元素时: 

if(count  >= 100) throw 一个没有空间的异常
this.arr[this.tail] = o; 
tail = (tail + 1) % this.arr.length; //如果到数组最后则从头开始 
count++;  

但当弹出时: 
if(count <= 0) return null; 

object o = this.arr[this.head];  
this.arr[this.head] = null;  
this.head = (this.head + 1) % this.arr.length;  
count--;  

this.arr[this.head] = null;这里如何不主动设置null.则这个对象被pop出去后 
arr中始终有一个引用指向这个对象而使对象不能回收,如果你只是临时放一个对象到 
Queue中马上就POP出来使用,本来你以为使用后可以被回收,却因为arr中同时有一个 
引用指向它,如果这个引用不被其它元素替换掉,则原来那个对象一直不能被回收。 

凡是类似的有底层容器和外部封装同时对一个对象持有多个引用的,在你用完了这个对象后 
你应该把其它指向它的引用手工置为null;其它情况(指正常的只有一个引用时)不应该置为null

(完全是多余) 

其实上面的情况相当于:         object o = new object();

        o1 = o; 
        o.xxx();//使用完了,使用完了的意思是我知道o1也不需要再操作这个对象 
                    //我本来想在这个位置对象进入可回收的状态,但因为o1还没有超出作用域,

                    //所以不能被回收,所以要手工设置o1 = null; 
                    //这样这个对象才会被回收。

    }   

}   

分享到:
评论

相关推荐

    还在用if(obj!=null)做非空判断,带你快速上手Optional

    Optional 是 Java 8 中引入的新特性,旨在解决空指针异常(Null Pointer Exception,NPE)这个长期困扰开发者的问题。下面我们将对 Optional 的基本概念、使用方法、优点等进行详细的介绍。 Optional 的基本概念 ...

    javascript 处理null及null值示例

    代码如下: function dealNull(obj){ for(var i in obj){ if(null == obj[i] || ‘null’ == obj[i]){ obj[i]=”; }else if(‘object’ == typeof obj[i]){ dealNull(obj[i]); } } }; // 测试的对象 var a={}; a.aa=...

    java 判断对象是否为空

    在Java中,你可以直接使用`==`运算符来比较一个对象引用是否为`null`。例如: ```java Object obj = getSomeObject(); if (obj == null) { System.out.println("对象为空"); } else { System.out.println("对象...

    学校系统web网页设计

    在IT行业中,Web网页设计是一项基础且至关重要的技能,尤其对于教育机构而言,构建一个功能齐全、用户体验良好的学校系统Web网页至关重要。... ...在描述中提到的“主页”、“导航栏”和“分页跳转”是Web页面常见且关键...

    java:单例模式 作为对象的创建模式

    这种模式通常用于那些需要频繁实例化然后销毁,或者创建代价昂贵的对象,比如线程池、缓存、对话框、注册表设置、日志对象等。 单例模式的特点可以总结为以下三点: 1. **唯一性**:一个类只能有一个实例。这是...

    还在用if(obj-=null)做非空判断?带你快速上手Optional实战性理解-.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    [] - 2023-09-26 答应我, 不要再用 if (obj -= null) 判空了.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    jmzPHP文档这是关于杰马逊PHP应用平台的部分方法集

    - `navigate($obj, $Value = null, $Value1 = null, $Value2 = null, $Value3 = null)`:完成URL自动补全和网址导航。 - `AD($obj, $Value = null, $Value1 = null, $Value2 = null, $Value3 = null)`:广告输出相关...

    JS 中如何判断 undefined null.rar

    因此,如果你想检查一个值是否既不是 `undefined` 也不是 `null`,你可以使用这样的逻辑: ```javascript if (myValue !== undefined && myValue !== null) { // 值存在且不是 undefined 或 null } ``` 或者,...

    javascript 数组内存释放

    在这个例子中,尽管`obj`被设置为`null`,但`arr`仍然引用着`obj`,因此`obj`不会被垃圾回收,`arr`也无法释放。要真正释放数组及其包含的内存,必须确保所有相关的引用都被解除。 此外,循环引用也是导致内存泄漏...

    javascript中删除指定数组中指定的元素的代码

    函数如下: 代码如下: foreach = function (obj, insp){ if(obj== null && obj.constructor != Array){ return []; } //obj是要处理的数组,obj==null 表示对象尚未存在;obj.constructor != Array 表示对象obj的...

    java 实现下拉列表JComboBox中值和显示不同

    通常情况下,我们需要在 JComboBox 中显示一组选项,而实际上选项的值却不同于显示的文字。这时,我们可以自定义一个类,实现 Serializable 接口,并重写 toString 方法,以便在 JComboBox 中显示自定义的文字同时...

    servlet制作网站

    Object obj = null; try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); if (re.next()) { obj=re.getString(1); } } catch (Exception ex) { ex....

    可以实现图片放大的js代码

    if(img&&typeof(img.ctrlid)==="string") {var ele,obj=img.parentNode; img.onmousedown=null; document.onmousemove=null; document.onmouseup=null; ele=document.getElementById(img.overid); if(ele) ...

    Java String转换时为null的解决方法

    注意,如果obj为null,这里转换后的值已经是字符串的“null”,判空不能再用 obj == null,也不能使用apache.commons.lang3下的StringUtils.isBank(CharSequence cs),而应该用 str.equals("null")。 判null条件 ...

    Excel POI读取封装(文件+示范代码)

    Object obj = null; if (classzz == Integer.class) { if (src.contains(".")) { src = src.substring(0, src.indexOf(".")); obj = Integer.valueOf(src); } } if (classzz == Double.class) obj = ...

    js实现双向链表互联网机顶盒实战应用实现

    if (node == null || obj == null) return; node.data = obj; return node; }; Dare.LinkedList.prototype.getNodeData = function (node) { if (node == null) return; return node.data; }; ``` 在互联网机...

    c#实现导出excel功能[参照].pdf

    BoxIcon.Error); return ; } } // 创建一个新的 Excel 工作簿并设置其属性Excel.... } catch (Exception ex) { obj = null ; Console.WriteLine("对象不能被释放" + ex.Message); } finally { GC.Collect(); } }

    关于System.Convert的那些事儿

    =null && Convert.ToBoolean(obj)==true){ //Do something}上面的代码的意图很明显,先判断obj 是不是null,如果不是null 的话,再调用Convert.ToBoolean方法,判断是不是True。 上面的方法没有任何问题,但有一点...

    Java中对null进行强制类型转换的方法

    在 Java 中,对 null 进行强制类型转换是一个常见的操作,但是在实际开发中,是否会抛出异常呢?今天,我们将通过实例代码来介绍 Java 中对 null 进行强制类型转换的方法。 首先,让我们看一下基本类型的强制类型...

Global site tag (gtag.js) - Google Analytics