这个问题原贴发表在这儿:
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中,当开发者需要访问一个对象的深层属性时,需要逐级检查每个层次是否为`null`或`undefined`。例如,在下面的例子中: ```javascript const message = {}; const firstName = message.body.user....
Optional 是 Java 8 中引入的新特性,旨在解决空指针异常(Null Pointer Exception,NPE)这个长期困扰开发者的问题。下面我们将对 Optional 的基本概念、使用方法、优点等进行详细的介绍。 Optional 的基本概念 ...
代码如下: 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=...
Object obj = null; try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); if (re.next()) { obj=re.getString(1); } } catch (Exception ex) { ex....
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
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中,你可以直接使用`==`运算符来比较一个对象引用是否为`null`。例如: ```java Object obj = getSomeObject(); if (obj == null) { System.out.println("对象为空"); } else { System.out.println("对象...
代码如下: var YX = { //得到JS内置数据类型的类型,返回值包括[Date,RegExp,Number,String,Array,Boolean,Function,null,undefined,Object] getType : function(obj){ return obj == null ? obj + “” : Object....
这种模式通常用于那些需要频繁实例化然后销毁,或者创建代价昂贵的对象,比如线程池、缓存、对话框、注册表设置、日志对象等。 单例模式的特点可以总结为以下三点: 1. **唯一性**:一个类只能有一个实例。这是...
在IT行业中,Web网页设计是一项基础且至关重要的技能,尤其对于教育机构而言,构建一个功能齐全、用户体验良好的学校系统Web网页至关重要。... ...在描述中提到的“主页”、“导航栏”和“分页跳转”是Web页面常见且关键...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
- `navigate($obj, $Value = null, $Value1 = null, $Value2 = null, $Value3 = null)`:完成URL自动补全和网址导航。 - `AD($obj, $Value = null, $Value1 = null, $Value2 = null, $Value3 = null)`:广告输出相关...
因此,如果你想检查一个值是否既不是 `undefined` 也不是 `null`,你可以使用这样的逻辑: ```javascript if (myValue !== undefined && myValue !== null) { // 值存在且不是 undefined 或 null } ``` 或者,...
在这个例子中,尽管`obj`被设置为`null`,但`arr`仍然引用着`obj`,因此`obj`不会被垃圾回收,`arr`也无法释放。要真正释放数组及其包含的内存,必须确保所有相关的引用都被解除。 此外,循环引用也是导致内存泄漏...
函数如下: 代码如下: foreach = function (obj, insp){ if(obj== null && obj.constructor != Array){ return []; } //obj是要处理的数组,obj==null 表示对象尚未存在;obj.constructor != Array 表示对象obj的...
通常情况下,我们需要在 JComboBox 中显示一组选项,而实际上选项的值却不同于显示的文字。这时,我们可以自定义一个类,实现 Serializable 接口,并重写 toString 方法,以便在 JComboBox 中显示自定义的文字同时...
注意,如果obj为null,这里转换后的值已经是字符串的“null”,判空不能再用 obj == null,也不能使用apache.commons.lang3下的StringUtils.isBank(CharSequence cs),而应该用 str.equals("null")。 判null条件 ...
需要注意的是,这里的 `Simplized` 和 `Traditionalized` 函数是假设存在的转换函数,实际上可能需要调用第三方库或API来实现具体的转换逻辑。 此外,代码中还涉及到了一个 `setCookie` 函数,用于记录用户的转换...
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) ...
`,如果`obj`为null,`value`也会是null,而不会抛出异常。 3. **自动属性初始化**:在声明属性时可以直接为其提供默认值,如`public string FirstName = "Default";`,这在创建简单模型类时特别有用。 4. **使用...