一尘不染

Java中的null是什么?

java

什么null

null任何实例吗?

null属于什么集合?

它在内存中如何表示?


阅读 503

收藏
2020-02-26

共1个答案

一尘不染

null是否是任何实例?

不,没有类型nullinstanceof

15.20.2类型比较运算符 instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

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

这意味着对于任何类型的E和R,对于任何E o,在那里o == nullo instanceof R永远是false

“ null”属于什么集合?

JLS 4.1类型和值的种类

还有一个特殊的null类型,即expression的类型null,它没有名称。由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。所述null参考是一个表达式的唯一可能的值无效的类型。该null参考总是可以被转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装这null只是可以是任何引用类型的特殊文字。

什么是null?

正如上面的JLS引用所言,在实践中,你可以简单地假装它是“仅仅是可以用于任何引用类型的特殊文字”。

在Java中,null == null(其他语言并不总是这样)。另请注意,根据合同,它还具有以下特殊属性(来自java.lang.Object):

public boolean equals(Object obj)

对于任何非null参考值xx.equals(null)应该return false

它也是所有引用类型的默认值(对于具有它们的变量):

JLS 4.12.5变量的初始值

每个类变量,实例变量或数组组件在创建时均使用默认值初始化:
对于所有引用类型,默认值为null
使用方法各不相同。你可以使用它来启用所谓的字段的惰性初始化,在这种情况下,字段将具有其初始值,null直到它被实际使用为止,在该字段中它被“实际”值(计算起来可能很昂贵)代替。

还有其他用途。让我们举一个真实的例子java.lang.System

public static Console console()

返回:系统控制台(如果有),否则null。

这是一种非常常见的使用模式:null用于表示对象不存在。

这是另一个用法示例,这次来自java.io.BufferedReader

public String readLine() throws IOException

返回:String包含行内容的A ,不包含任何行终止字符,或者null是否已到达流的末尾。

因此在这里,readLine()将为instanceof String每一行返回,直到最终返回a 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不一定表示该映射不包含键的映射;否则,返回值为0 。映射也可能将键显式映射到null。该containsKey操作可用于区分这两种情况。

在这里,我们开始了解使用null如何使事情复杂化。第一条语句说,如果键未映射,null则返回。第二个声明说,即使按键映射,null可也被退回。

相反,java.util.Hashtable通过不允许null键和值来简化事情;其V get(Object key),如果返回null,则明确表示未映射密钥。

你可以通读其余的API,并找到在何处以及如何null使用它们。请记住,它们并不总是最佳实践示例。

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

  • Uninitialized state
  • Termination condition
  • Non-existing object
  • An unknown value

它在内存中如何表示?

在Java中?不用担心 最好保持这种方式。

null是好事吗?

现在这是边界主观的。有人说这null会导致许多程序员可以避免的错误。有人说,在NullPointerException像Java这样的流行语言中,最好使用它,因为你会因程序员错误而快速失败。有些人避免null使用Null对象模式等。

它本身就是一个巨大的主题,因此最好将其讨论为对另一个问题的解答。

最后,我将引用null他自己的发明者CAR Hoare的话(快速成名):

我称之为我的十亿美元错误。null引用是1965年发明的。当时,我正在设计第一个用于面向对象语言(ALGOL W)的引用的综合类型系统。我的目标是确保所有对引用的使用都绝对安全,并由编译器自动执行检查。但是我无法抗拒引入null引用的诱惑,仅仅是因为它是如此容易实现。这导致了无数的错误,漏洞和系统崩溃,在最近四十年中可能造成十亿美元的痛苦和破坏。

2020-02-26