当值设置为 null 时,幕后会发生啥?
Posted
技术标签:
【中文标题】当值设置为 null 时,幕后会发生啥?【英文标题】:What happens behind the scenes when a value is set to null?当值设置为 null 时,幕后会发生什么? 【发布时间】:2013-09-08 17:42:39 【问题描述】:假设我有一个填充的对象数组。
Resource[] list = new Resource[100000];
偶尔,我想将此列表中的一个对象更改为默认值。
Resource defaultResource = new Resource();
稍后,我想检查该项目是否为默认项目。 所以,我想知道将列表对象设置为默认值与将值设置为 null 之间的性能差异可能是什么。
list[i] = defaultResource; /*versus*/ list[i] = null;
所以说真的,我想知道当一个值设置为 null 而不是将其设置为其他值时,幕后发生了什么。
对不起,如果这是一个愚蠢的问题!
【问题讨论】:
【参考方案1】:为您的方案考虑的一个可能选项 - 您希望不必编写空检查代码的简化。
考虑使用代表默认值的存根子类化您的 Resource
类。
public class NoResource : Resource
// ... later
if (res is NoResource)
// handle default value
这样,您的代码仍然能够像预期的那样使用Resource
对象,并且您可以选择轻松地检查默认的Resource
。
【讨论】:
感谢您的建议,但它不太适合我的情况。【参考方案2】:将变量设置为现有对象与将其设置为null
并没有太大区别。在这两种情况下,之前已被该变量引用的对象将更接近成为垃圾回收的条件,而不管该变量中存储的新值是 null
还是不同的对象。分配的其余部分也以相同的方式进行:CLR 不维护引用计数,因此在进行分配时不需要特别发生任何特殊情况。
存储一个默认对象来代替 null
可能是有益的,以避免在运行时进行大量的 null
检查:这样做可以简化代码,并减少在运行时进行分支的需要。
【讨论】:
以上是关于当值设置为 null 时,幕后会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
spring boot加mybatis使用Map返回时,当值为空时属性也会没有(转)
如果我总是在准备好的语句中使用 varchar 设置 null 会发生啥?