null是多少?

null是一个例子吗?

null属于哪一套?

它在记忆中是如何表现的?

推荐答案

null是一个实例吗?

不,没有nullinstanceof的类型.

15.20.2 Type Comparison Operator instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

在运行时,如果RelationalExpression的值不是null,则instanceof运算符的结果是true,并且可以将引用强制转换为ReferenceType,而无需引发ClassCastException.否则结果为false.

这意味着对于任何类型ER,对于任何类型E o,其中o == nullo instanceof R始终是false.


"null"属于哪个集合?

JLS4.1类型和值的种类

还有一种特殊的null类型,表达式null的类型,它没有名字.因为null类型没有名称,所以不可能声明null类型的变量或转换为null类型.null引用是null类型表达式的唯一可能值.null引用始终可以转换为任何引用类型.实际上,程序员可以忽略null类型,假装null只是一个特殊的文本,可以是任何引用类型.


什么是空的?

正如上面引用的JLS所说,在实践中,你可以简单地假装它"只是一个特殊的文字,可以是任何引用类型".

在Java中,null == null(在其他语言中并不总是如此).另请注意,根据合同,它还具有以下特殊属性(从java.lang.Object开始):

public boolean equals(Object obj)

对于任何非null的参考值x,x.equals(null)应为return false.

对于所有引用类型,它也是default value(对于具有它们的变量):

JLS 4.12.5变量的初始值

  • Each class variable, instance variable, or array component is initialized with a default value when it is created:
    • 对于所有引用类型,默认值为null.

它的使用方式各不相同.您可以使用它来启用所谓的lazy initialization个字段,其中一个字段在实际使用之前其初始值为null,并被"真实"值替换(计算成本可能很高).

还有其他用途.让我们从java.lang.System的例子来看:

public static Console console()

Returns:系统控制台(如果有),否则为null.

这是一个非常常用的模式:null用于表示对象不存在.

下面是另一个用法示例,这次是java.io.BufferedReader:

public String readLine() throws IOException

Returns:包含行内容的String,不包括任何行终止字符,或者null,如果已经到达流的末尾.

在这里,每行readLine()会返回instanceof String,直到最后返回null表示结束.这允许您按如下方式处理每一行:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

可以对API进行设计,使终止条件不依赖于readLine()返回null,但是可以看到这种设计的好处是使事情简明扼要.请注意,空行没有问题,因为空行"" != null.

让我们再举一个例子,这一次是从java.util.Map<K,V>开始:

V get(Object key)

返回指定键映射到的值,如果此映射不包含该键的映射,则返回null.

如果该映射允许null个值,那么返回值null并不一定表示该映射不包含键的映射;也有可能映射将密钥显式映射到null.containsKey操作可用于区分这两种情况.

在这里,我们开始了解使用null如何使事情变得复杂.第一条语句表示,如果未映射密钥,则返回null.第二条语句表示,即使映射了密钥,也可以返回null.

In contrast, java.util.Hashtable keeps things simpler by not permitting null keys and values; its V get(Object key)个, if returns null, unambiguously means that the key isn't mapped.

你可以通读一下接口的睡觉,了解null在哪里使用,如何使用.一定要记住,它们并不总是best practice个例子.

一般来说,null作为一个特殊值来表示:

  • 未初始化状态
  • 终止条件
  • 不存在的对象
  • 未知值

它在内存中是如何表示的?

在Java ?不关你的事.最好保持这样.


Is null a good thing?

这现在是主观的边缘.有人说null导致了许多本可以避免的程序员错误.有人说,在一种像Java这样的语言中,使用它是很好的,因为在程序员出错时,你会很快失败.有些人用Null object pattern等来避免null.

这本身就是一个巨大的话题,所以最好作为另一个问题的答案来讨论.

我将引用null的发明者自己的一句话来结束这段话,C.A.R Hoare(快速排序成名):

I call it my billion-dollar mistake.这是1965年null号参考号的发明.当时,我正在设计第一个面向对象语言(ALGOL W)中引用的综合类型系统.我的目标是确保引用的所有使用都是绝对安全的,由编译器自动执行判断.但我忍不住想输入null个引用,因为它很容易实现.这导致了无数错误、漏洞和系统崩溃,在过go 40年中,这些错误、漏洞和系统崩溃可能造成了10亿美元的痛苦和损失.

video of this presentation更深;这是一款推荐的手表.

Java相关问答推荐

Spring bootstrap @ Asmat注释与@ Routed

gitlab ci不会运行我的脚本,因为它需要数据库连接'

Java 8中的多个字段和计数

对某一Hyroby控制器禁用@cacheable

AssertJ Java:多条件断言

在springboot 3中,当我调用api endpoint时,会出现404

什么是Java原子属性的正确getter和setter

如何从Keyloak映射Hibernate实体中的用户

匹配一组字符或另一组字符

Docker不支持弹性APM服务器

删除打印语句会影响功能...腐败在起作用?

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

我的代码是线程安全的吗?[Java、CAS、转账]

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

JXBrowser是否支持加载Chrome扩展?

如何判断元素计数并在流的中间抛出异常?

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

Java泛型方法重载