繁体   English   中英

将 Boolean.TRUE/Boolean.FALSE 或 true/false 分配给 boolean 原始变量更好吗?

[英]Is it better to assign Boolean.TRUE/Boolean.FALSE or true/false to a boolean primitive variable?

在做一些代码审查时,我偶然发现了这个:

人们通常将Boolean.TRUEBoolean.FALSE值分配给盒装的 boolean 变量,但对原始变量使用true / false 最好的方法是什么?

根据与我合作的一位架构师的说法 - 他说每次您将true / false分配给变量时,都会创建一个新的 Boolean 实例。 如果我们将 boolean 变量分配给 static 个实例,我们可以跳过它 - Boolean.FALSE / Boolean.TRUE 如果变量是原始变量,则完成自动拆箱。

自动拆箱是否比 boolean 变量的初始化更快? 差异不大,我认为这只是代码的微优化,但我想了解更多相关信息。

你是对的,性能问题主要是分散注意力。

要了解发生了什么,让我们看一下 Java 类型系统中基元及其框是如何建模的。

C extends D时,这意味着CD ,或者CD子类型 Integer分配给Number时,不需要转换,因为Integer是一个Number 在幕后, IntegerNumber都由指针(对象引用)表示,赋值只是指针副本。

但是, booleanBoolean之间的关系是不同的。 没有extends 没有is-a 相反,有装箱拆箱转换,它们在某些上下文中应用(例如,赋值、方法参数)。它们的表示是不同的。 因此,当您在booleanBoolean之间进行转换时,形式会发生变化(从 boolean 值的直接表示,变为指向包含 object header 和 boolean 的堆节点的指针。) "; 这不仅仅是复制一个词。 (也就是说,如果这是您程序中的性能瓶颈,那么您的问题就更大了——也就是说,您的程序做的并不多。)

当你分配

boolean b = true;

要么

Boolean bb = Boolean.TRUE;

=两侧的类型相同——第一个示例中为boolean ,第二个示例中为Boolean并且没有转换。 当你做

boolean b = Boolean.TRUE;

要么

Boolean bb = true;

类型不同,需要转换。 编译器默默地将这些翻译成:

boolean b = Boolean.TRUE.booleanValue();

Boolean bb = Boolean.valueOf(true);

boolean的特定情况下,与其他原语相比,性能问题的相关性甚至更低,因为只有两个 boolean 值,常量Boolean.TRUEBoolean.FALSE被驻留。

如果您的架构师主要针对性能问题向您提供此建议,那么他/她就被误导了。 如果他们的建议更多是出于简单性的考虑——即使用不需要转换的正确类型的值同样容易——这是明智的。

在进行一些代码审查时,我偶然发现了这一点:

人们通常将Boolean.TRUEBoolean.FALSE值分配给装箱的 boolean 变量,但对原始变量使用true / false 最好的方法是什么?

根据我合作过的一位建筑师的说法 - 他说每次你将true / false分配给一个变量时,都会创建一个 Boolean 的新实例。 如果我们将 boolean 变量分配给 static 实例 - Boolean.FALSE / Boolean.TRUE 如果变量是原始变量,则会完成自动拆箱。

自动拆箱是否比 boolean 变量的初始化更快? 差异不大,我认为这只是代码的微优化,但我想了解更多相关信息。

如果您有原始 boolean 变量,则分配 true 或 false 以避免执行拆箱。

如果您有包装器 Boolean 变量,则使用 Boolean.TRUE 或 Boolean.FALSE 来避免执行新的 object 的装箱和/或实例化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM