栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中的null是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的null是什么?

null
是否是任何实例?

不,没有类型

null
instanceof

15.20.2类型比较运算符

instanceof

Relationalexpression:    Relationalexpression instanceof ReferenceType

在运行时,

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

这意味着对于任何类型的E和R,对于任何

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号