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;
}