`
yesjavame
  • 浏览: 687447 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

是否需要设置obj = null?

阅读更多

这个问题原贴发表在这儿:

http://topic.csdn.net/u/20090408/13/89c22659-e194-488d-add1-23256b22465e.html?seed=2029607558

虽然是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;
//这样这个对象才会被回收。

}

}

分享到:
评论

相关推荐

    【JavaScript源代码】ES2020让代码更优美的运算符 (.) ().docx

    传统的JavaScript中,当开发者需要访问一个对象的深层属性时,需要逐级检查每个层次是否为`null`或`undefined`。例如,在下面的例子中: ```javascript const message = {}; const firstName = message.body.user....

    还在用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=...

    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....

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

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

    pageDate封装参数,不用实体类

    obj = request == null ? arr:(request.getParameter((String)key) == null ? arr:arr[0]); } else { obj = map.get(key); } return obj; } public static boolean hasVal(PageData pd,String key){ return...

    java 判断对象是否为空

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

    一些常用的JavaScript函数(json)附详细说明

    代码如下: var YX = { //得到JS内置数据类型的类型,返回值包括[Date,RegExp,Number,String,Array,Boolean,Function,null,undefined,Object] getType : function(obj){ return obj == null ? obj + “” : Object....

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

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

    学校系统web网页设计

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

    [] - 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 中显示自定义的文字同时...

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

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

    中英文网页转换

    需要注意的是,这里的 `Simplized` 和 `Traditionalized` 函数是假设存在的转换函数,实际上可能需要调用第三方库或API来实现具体的转换逻辑。 此外,代码中还涉及到了一个 `setCookie` 函数,用于记录用户的转换...

    可以实现图片放大的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) ...

    C#6.0语言入门-微软.pdf_Csharp6.0中文手册_

    `,如果`obj`为null,`value`也会是null,而不会抛出异常。 3. **自动属性初始化**:在声明属性时可以直接为其提供默认值,如`public string FirstName = "Default";`,这在创建简单模型类时特别有用。 4. **使用...

Global site tag (gtag.js) - Google Analytics