Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Boolean.TRUE和TRUE之间有什么区别_Java_Wrapper - Fatal编程技术网

Java Boolean.TRUE和TRUE之间有什么区别

Java Boolean.TRUE和TRUE之间有什么区别,java,wrapper,Java,Wrapper,首先,我有 private Map<String, Boolean> mem = new HashMap<String, Boolean>(); 为什么我不能在if语句中使用“mem.get(s)==true”。将出现错误“第6行:java.lang.NullPointerException” 我想我还是不能很好地理解包装类。请给我一些指导。谢谢大家! 如果mem.get为null并将与原始布尔值进行比较,java将进行自动装箱。这意味着它将调用null.boolean

首先,我有

private Map<String, Boolean> mem = new HashMap<String, Boolean>();
为什么我不能在if语句中使用“mem.get(s)==true”。将出现错误“第6行:java.lang.NullPointerException”

我想我还是不能很好地理解包装类。请给我一些指导。谢谢大家!

如果
mem.get
为null并将与原始布尔值进行比较,java将进行自动装箱。这意味着它将调用
null.booleanValue()


这就是你得到NPE的原因。

这是一个逻辑问题,而不是基于语言的问题<如果
s
不在
mem
中,则code>if(mem.contains)| | Boolean.TRUE==mem.get(s))将只检查条件的第二部分。因此,比较相当于
Boolean.TRUE==null
。由于
Boolean.TRUE
是一个
Boolean
对象,因此比较是在两个引用之间进行的(并且总是返回
false
)<另一方面,code>boolean是一种基本类型,因此必须首先转换从
mem
检索到的
boolean
。由于它的
null
无法转换为基元类型。

看起来
mem.get(s)
返回
Boolean
类型结果。在java中,有两种类型用于处理逻辑值<代码>布尔值对象类型和
布尔值
基本类型

为了计算
if
语句的逻辑表达式,java将
Boolean
转换为
Boolean


但是,如果您的方法返回的是
null
而不是
Boolean
对象,那么java无法将该值取消绑定到Boolean基元类型。当字典不包含
s
wordDict.contains
false
)时,将计算第二个条件(
mem.get==true

在Java的库映射中,尝试获取不存在的键的值会返回
null
。因此,每当该键不在
mem
映射中时,就会返回
null
,并(使用
=
)与
true
进行比较。当
Boolean
类型与
Boolean
值进行比较或分配给该值时,该类型为。这意味着调用
Boolean.booleanValue()
方法。如果
Boolean
null
,这就是导致异常的原因,因为它意味着调用
null.booleanValue()
null
不是什么,所以它不知道如何成为布尔值

包装器类是有用的构造,它使基元类型能够与从
对象
继承的类型(即引用类型(其他所有类型))进行互操作。当您处理基元类型(“值”类型)时,它们的值直接出现在描述它们的位置中——要么作为用于执行当前函数的内存的一部分(对于局部变量),要么作为分配给内存空间中对象的内存空间的一部分(对于字段变量)。当您处理引用类型(那些从
对象
继承的类型,包括
布尔
和其他包装类型)时,被引用的数据反而存在于称为的内存空间中。除了此堆内存分配之外,为了知道对象在哪里,与值类型的值类似的实体实际上是对对象内存位置的引用,存储为局部变量或字段变量,而不是对象本身的值或数据。这就是使这些变量成为
null
:一个
null
引用表示这个变量没有特别指向任何东西。(有关更多详细信息,请阅读堆栈和堆分配。)

Boolean.TRUE
相比,您之所以安全,是因为在
对象
类型上,例如
Boolean
(以及用于基本类型的任何包装类),类型为
Boolean
的变量实际上是一个引用。这意味着
=
操作符实际上是在检查-即,内存中的实际对象是否是相同的对象(具有相同的内存位置),而不是根据基于值的“相等”定义检查它们是否“相等”。您不希望出现这种情况,因为您可能会得到令人惊讶的结果,如
new Boolean(true)==new Boolean(true)
返回false。顺便说一句,这就是为什么我们有
equals
方法的原因——对于希望通过值而不是引用进行比较的对象,任何类都应该定义该方法。另一方面,对于基本值类型,如
布尔值
=
运算符会逐字比较值。这就是为什么自动取消包装类型框和取消包装很有用的原因-一个
布尔值
变量(没有被“取消引用”-找到它指向的值)实际上是一个引用值,引用内存位置。
boolean
变量是实际的布尔值。因此,如果没有自动拆箱和装箱,那么尝试比较这两者是没有意义的


如果要确保
mem.get(s)
的值既不是
null
,也不是
false
,请使用类似
mem.containsKey(s)和&mem.get(s)==true的值。第一个检查确保没有空引用。

wordDict在哪里定义?你确定它不是空的吗?wordDict是一个字符串数组。比如:wordDict=[“你好”,“单词”]。这是来自Leetcode NO.139的一个问题,请向我们展示第6行中的代码。公共布尔分词(字符串s,Set wordDict){if(wordDict.contains(s)| | boolean.TRUE==mem.get(s)){return TRUE;}可能是mem.get(s)返回空值。哦,明白了!你能给我解释一下为什么使用布尔值。真的有效吗?非常感谢!@beepretty因为布尔值是一个对象,可以为空。所以你的比较是
null==Boolean.TRUE
。不会进行自动装箱。哦!酷!非常感谢!!我理解
  if (wordDict.contains(s) ||  Boolean.TRUE==mem.get(s)) {
        return true;
    }