什么null啊
null
是null任何实例吗?
null属于什么集合?
它在内存中如何表示?
null是否是任何实例?
不,没有类型null是instanceof。
instanceof
15.20.2类型比较运算符 instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
在运行时,instanceof运算符的结果是,true如果RelationalExpression的值不是null,并且引用可以强制转换为ReferenceType而不引发ClassCastException。否则结果为false。
RelationalExpression
ReferenceType
ClassCastException
false
这意味着对于任何类型的E和R,对于任何E o,在那里o == null,o instanceof R永远是false。
E o
o == null
o instanceof R
“ null”属于什么集合?
JLS 4.1类型和值的种类
还有一个特殊的null类型,即expression的类型null,它没有名称。由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。所述null参考是一个表达式的唯一可能的值无效的类型。该null参考总是可以被转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装这null只是可以是任何引用类型的特殊文字。
expression
什么是null?
正如上面的JLS引用所言,在实践中,你可以简单地假装它是“仅仅是可以用于任何引用类型的特殊文字”。
在Java中,null == null(其他语言并不总是这样)。另请注意,根据合同,它还具有以下特殊属性(来自java.lang.Object):
null == null
java.lang.Object
public boolean equals(Object obj)
对于任何非null参考值x,x.equals(null)应该return false。
x
x.equals(null)
return false
它也是所有引用类型的默认值(对于具有它们的变量):
JLS 4.12.5变量的初始值
每个类变量,实例变量或数组组件在创建时均使用默认值初始化: 对于所有引用类型,默认值为null。 使用方法各不相同。你可以使用它来启用所谓的字段的惰性初始化,在这种情况下,字段将具有其初始值,null直到它被实际使用为止,在该字段中它被“实际”值(计算起来可能很昂贵)代替。
还有其他用途。让我们举一个真实的例子java.lang.System:
java.lang.System
public static Console console()
返回:系统控制台(如果有),否则null。
这是一种非常常见的使用模式:null用于表示对象不存在。
这是另一个用法示例,这次来自java.io.BufferedReader:
java.io.BufferedReader
public String readLine() throws IOException
返回:String包含行内容的A ,不包含任何行终止字符,或者null是否已到达流的末尾。
String
因此在这里,readLine()将为instanceof String每一行返回,直到最终返回a null表示结束。这使你可以按以下方式处理每一行:
readLine()
instanceof String
a null
String line; while ((line = reader.readLine()) != null) { process(line); }
可以设计API,使终止条件不依赖于readLine()返回null,但是可以看到,这种设计具有使事情简洁的好处。请注意,空行没有问题,因为空行"" != null。
API
"" != null
让我们再举一个例子,这次是从java.util.Map<K,V>:
java.util.Map<K,V>
V get(Object key)
返回指定键所映射到的值,或者null此映射不包含该键的映射。
如果此映射允许null值,则返回值null不一定表示该映射不包含键的映射;否则,返回值为0 。映射也可能将键显式映射到null。该containsKey操作可用于区分这两种情况。
containsKey
在这里,我们开始了解使用null如何使事情复杂化。第一条语句说,如果键未映射,null则返回。第二个声明说,即使按键映射,null可也被退回。
相反,java.util.Hashtable通过不允许null键和值来简化事情;其V get(Object key),如果返回null,则明确表示未映射密钥。
java.util.Hashtable
你可以通读其余的API,并找到在何处以及如何null使用它们。请记住,它们并不总是最佳实践示例。
一般来说,null用作特殊值表示:
在Java中?不用担心 最好保持这种方式。
null是好事吗?
现在这是边界主观的。有人说这null会导致许多程序员可以避免的错误。有人说,在NullPointerException像Java这样的流行语言中,最好使用它,因为你会因程序员错误而快速失败。有些人避免null使用Null对象模式等。
NullPointerException
Null
它本身就是一个巨大的主题,因此最好将其讨论为对另一个问题的解答。
最后,我将引用null他自己的发明者CAR Hoare的话(快速成名):
我称之为我的十亿美元错误。null引用是1965年发明的。当时,我正在设计第一个用于面向对象语言(ALGOL W)的引用的综合类型系统。我的目标是确保所有对引用的使用都绝对安全,并由编译器自动执行检查。但是我无法抗拒引入null引用的诱惑,仅仅是因为它是如此容易实现。这导致了无数的错误,漏洞和系统崩溃,在最近四十年中可能造成十亿美元的痛苦和破坏。