虽然是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;
//这样这个对象才会被回收。
}
}
分享到:
相关推荐
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=...
在Java中,你可以直接使用`==`运算符来比较一个对象引用是否为`null`。例如: ```java Object obj = getSomeObject(); if (obj == null) { System.out.println("对象为空"); } else { System.out.println("对象...
在IT行业中,Web网页设计是一项基础且至关重要的技能,尤其对于教育机构而言,构建一个功能齐全、用户体验良好的学校系统Web网页至关重要。... ...在描述中提到的“主页”、“导航栏”和“分页跳转”是Web页面常见且关键...
这种模式通常用于那些需要频繁实例化然后销毁,或者创建代价昂贵的对象,比如线程池、缓存、对话框、注册表设置、日志对象等。 单例模式的特点可以总结为以下三点: 1. **唯一性**:一个类只能有一个实例。这是...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
互联网资讯,技术简介,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 中显示自定义的文字同时...
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(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,这里转换后的值已经是字符串的“null”,判空不能再用 obj == null,也不能使用apache.commons.lang3下的StringUtils.isBank(CharSequence cs),而应该用 str.equals("null")。 判null条件 ...
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 = ...
if (node == null || obj == null) return; node.data = obj; return node; }; Dare.LinkedList.prototype.getNodeData = function (node) { if (node == null) return; return node.data; }; ``` 在互联网机...
BoxIcon.Error); return ; } } // 创建一个新的 Excel 工作簿并设置其属性Excel.... } catch (Exception ex) { obj = null ; Console.WriteLine("对象不能被释放" + ex.Message); } finally { GC.Collect(); } }
=null && Convert.ToBoolean(obj)==true){ //Do something}上面的代码的意图很明显,先判断obj 是不是null,如果不是null 的话,再调用Convert.ToBoolean方法,判断是不是True。 上面的方法没有任何问题,但有一点...
在 Java 中,对 null 进行强制类型转换是一个常见的操作,但是在实际开发中,是否会抛出异常呢?今天,我们将通过实例代码来介绍 Java 中对 null 进行强制类型转换的方法。 首先,让我们看一下基本类型的强制类型...