PS:我理解“真实”与真实之间的区别。
编辑: 我也理解Boolean.TRUE是原语true的包装器,我的问题是 - 为什么原语boolean接受Boolean.TRUE作为值? 例如,
boolean boolVar = Boolean.TRUE;
似乎是一个有效的陈述。
答案 0 :(得分:29)
原因
boolean boolVar = Boolean.TRUE;
工作是因为 autounboxing ,这是一个Java 5功能,它允许在需要时自动将包装器对象转换为其原始等效项。相反, autoboxing 也是可能的:
Boolean boolVar = true;
答案 1 :(得分:26)
正如之前的答案所述,Boolean.TRUE
返回布尔值true
的包装器对象,因此对于我们需要处理布尔值的对象的上下文(例如,有ArrayList
布尔值,我们可以使用Boolean.TRUE
或Boolean.FALSE
至于原因:
boolean boolVar = Boolean.TRUE;
有效是因为Autoboxing and Unboxing。
简而言之,Java编译器在看到您将原语视为对象时,例如
List<Boolean> listOfBoolean = new ArrayList<Boolean>();
boolean someBool = true;
listOfBoolean.add(someBool);
它会自动换行,或者 autobox 它
List<Boolean> listOfBoolean = new ArrayList<Boolean>();
boolean someBool = true;
listOfBoolean.add(Boolean.valueOf(someBool));
如果它看到你将包装器对象(如Boolean.TRUE
)视为基元,则:
boolean boolVar = Boolean.TRUE;
它会将其转换为原语,或 unbox ,就像我们这样做:
boolean boolVar = Boolean.TRUE.booleanValue();
曾几何时,你必须亲手做到这一点,但现在,无论好坏,这主要是为你照顾的。
如果你想知道为什么会有Boolean.TRUE
,那是因为没有必要为true
漂浮许多布尔对象。由于布尔值只能是两个值中的一个,因此将它们作为常量更简单,而不是每次有人需要装箱时true
:
Boolean trueBool = new Boolean(true);
答案 2 :(得分:6)
Boolean.TRUE 是一个包装器对象和单例。 true 是一个文字常量。以下是我在原语上使用包装器的两种情况
答案 3 :(得分:3)
true
属于原始boolean
类型,而Boolean.TRUE
是包含true
值的Boolean
对象。
答案 4 :(得分:1)
由于多种原因,原始类型(e.i. boolean
)比类(e.i。Boolean
)更受青睐。见这里的讨论。 https://softwareengineering.stackexchange.com/questions/203970/when-to-use-primitive-vs-class-in-java。原语类型使代码更具可读性,防止指针错误(例如if(a==b)
vs if(a.equals(b))
),提高性能并跟随转换。
Boolean
或Integer
的效果优于boolean
和int
。也就是说,如果您希望允许null
作为值,则会出现这种情况。这导致了许多空检查,但它阻止了false
在
答案 5 :(得分:0)
Boolean.TRUE是对Boolean类对象的引用,而true只是原始布尔类型的值。像Boolean这样的类通常被称为“包装类”,并且在需要对象而不是基本类型时使用(例如,如果将它存储在数据结构中)。
答案 6 :(得分:0)
您也可以在下面的维基百科中找到关于该链接的说明。
Java中的所有原始包装类都是不可变的。 J2SE 5.0将原始类型的自动装箱引入其包装器对象,并将包装器对象自动拆箱为其原始值 - 包装器对象与原始值之间的隐式转换。