当前位置: 首页 > 面试题库 >

Java中的null是什么?

吕亮
2023-03-14
问题内容

什么null

null任何实例吗?

null属于什么集合?

它在内存中如何表示?


问题答案:

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引用的诱惑,仅仅是因为它是如此容易实现。这导致了无数的错误,漏洞和系统崩溃,在最近四十年中可能造成十亿美元的痛苦和破坏。



 类似资料:
  • 本文向大家介绍Java中的Null到底是什么,包括了Java中的Null到底是什么的使用技巧和注意事项,需要的朋友参考一下 前言 对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是n

  • 问题内容: 在Java 8中,您可以返回而不是。Java8文档说Optional是“一个可能包含也可能不包含非null值的容器对象。如果存在一个值,则isPresent()将返回true,而get()将返回该值。” 实际上,这为什么有用?另外,在任何情况下,使用都是首选?性能如何? 问题答案: 实际上,这为什么有用? 例如,假设您有以下整数流,并且正在执行过滤: 您事先并不知道过滤操作会删除Str

  • 问题内容: 我听说过新的Dart空安全语言功能(NNBD),目前称为“ “不可空”实验 ”。 默认情况下 应该引入 non- nullable 。 功能规范可在此处找到,语言GitHub问题可在此处找到。 它是如何工作的,我可以在哪里尝试? 问题答案: 当前可以在nullsafety.dartpad.dev中找到null安全/不可为空(默认情况下)的简短NNBD功能。 请记住,您可以在此处阅读完整

  • 问题内容: 我必须编写一个例程,如果变量的类型为,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为或。 第一个实现是因为我认为没有数字会使算术表达式为假,但是由于计算为真,所以这是错误的。然后,我得知行为类似于0,并且以下表达式均被评估为true。 当然不是0。被评估为false。这使看似重言式的表达成为错误。 为什么实际上不是0,却像0? 问题答案: 您真正的问题似乎是: 为什么:

  • 可能重复:if语句末尾有分号 我在编程时,在代码中发现了一个bug,这是因为“if”语句后面有一个分号,它的长方体“{xxx}”被执行时就好像它有自己的作用域一样--所以一切都会被编译。 这回避了一个问题,为什么是: Java中的一个可能的语句,它似乎是一行无用的代码,可能会产生很多bug等等。

  • 本文向大家介绍NULL是什么意思?相关面试题,主要包含被问及NULL是什么意思?时的应答技巧和注意事项,需要的朋友参考一下 NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。 对NULL这个值的任何比较都会生产一个NULL值。 您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。 使用IS NULL来进行NULL判断