Java中的布尔和布尔

在Java中有关于Integer vs int的讨论。前者的默认值是null,而后者的默认值是0Booleanboolean怎么样?

我的应用程序中的变量可以有0/1值。我想使用boolean/Boolean,而不喜欢使用int。我可以使用Boolean/boolean代替吗?

385239 次浏览

是的你可以使用Boolean/boolean代替。

第一个是对象,第二个是基本类型。

  • 第一个,你会得到更多有用的方法。

  • 考虑到内存消耗,第二个选项很便宜 第二个选项将为您节省更多内存,所以选择

现在选择你的道路。

你可以使用布尔常量 - Boolean.TRUEBoolean.FALSE来代替01。你可以创建类型为boolean的变量,如果你是原始的。这样你就不必创建新的Boolean对象。

Boolean 包装布尔基元类型。在JDK 5及以上版本中,Oracle(或Oracle收购之前的Sun)引入了自动装箱/拆箱,它本质上允许你这样做

boolean result = Boolean.TRUE;

Boolean result = true;

这基本上是编译器做的,

Boolean result = Boolean.valueOf(true);

所以,你的答案是肯定的。

我有点扩展提供的答案(因为到目前为止,他们专注于“自己的”/人工术语,专注于编程一种特定的语言,而不是关心创建编程语言场景背后的更大的情况,一般来说,即当类型安全与内存考虑因素产生差异时):

Int不是布尔值

考虑

    boolean bar = true;
System.out.printf("Bar is %b\n", bar);
System.out.printf("Bar is %d\n", (bar)?1:0);
int baz = 1;
System.out.printf("Baz is %d\n", baz);
System.out.printf("Baz is %b\n", baz);

与输出

    Bar is true
Bar is 1
Baz is 1
Baz is true

第3行(bar)?1:0上的Java代码说明了酒吧 (布尔)不能隐式转换(强制转换)为int。我提出这一点并不是为了说明JVM背后的实现细节,而是为了指出在低级别的考虑(如内存大小)方面,人们确实必须优先考虑值而不是类型安全。特别是在布尔类型中,类型安全没有真正/完全使用,在布尔类型中,以的形式进行检查

如果值\在{0,1}中,则转换为布尔类型,否则抛出异常。

这就是{0,1}<{2 ^ 31日. ., 2^31 -1}。听起来有点过头了,对吧?类型安全在用户定义的类型中真正重要,而在原语的隐式强制转换中并不重要(尽管last包含在first中)。

字节不是类型或位

请注意,在内存中,你的变量{0,1}仍然会占用至少一个字节或一个字(xbits取决于寄存器的大小),除非特别处理(例如,在内存中很好地打包- 8个“布尔”位到一个字节-来回)。

通过选择类型安全(例如将值放入/包装到特定类型的盒子中)而不是额外的值包装(例如使用位移位或算术),人们确实有效地选择了写更少的代码而不是获得更多的内存。(另一方面,总是可以定义一个自定义的用户类型,这将有助于所有不大于布尔值的转换)。

关键字与类型

最后,你的问题是关于比较关键字类型。我相信,解释为什么或如何通过使用/首选关键字(“标记”为原始的)而不是类型(使用另一个关键字的普通复合用户自定义类)来获得性能是很重要的。 或者说

boolean foo = true;

vs。

Boolean foo = true;

第一个“东西”(类型)不能被扩展(子类化),而且不是没有原因的。实际上,原始的包装类的Java术语可以简单地转换为内联值(一个LITERAL或常量,在可能推断出替换时被编译器直接替换,如果不能——仍然返回到包装值)。

实现优化的原因是:

“更少的运行时强制转换操作=>更快的速度。”

这就是为什么当实际的类型推断完成时,如果需要(或转换/强制转换为此类信息),它可能(仍然)以封装类的实例化结束。

因此,布尔布尔之间的区别恰好是编译运行时(有点远,但几乎是运算符getClass ())。

最后,自动装箱比原语慢

请注意,Java可以做自动装箱只是一个“语法糖”。它不会加速任何事情,只是让你写更少的代码。就是这样。仍然执行类型信息容器的强制转换和包装。出于性能考虑,选择算术,它总是跳过创建带有类型信息的类实例的额外管理工作,以实现类型安全。缺少类型安全是你为获得性能所付出的代价。对于带有布尔值表达式的代码,类型安全(当你写得更少时,因此是隐式的代码)将是至关重要的,例如if-then-else流控制。

布尔表示基本数据类型,其中布尔表示引用数据类型。这个故事开始于Java想要成为纯粹面向对象的时候,它提供了包装类的概念来克服原始数据类型的使用。

boolean b1;
Boolean b2;

b1b2是不同的。

一个观察结果:(尽管这可以被认为是副作用)

布尔是一个原语,可以表示yes或no。

布尔是一个对象(它可以指yes或no或'don't know'即null)

可以使用Boolean / Boolean。简单才是正确之道。 如果你不需要特定的api(集合,流等),并且你没有预见到你会需要它们-使用它的原始版本(布尔)

  1. 对于基本类型,你保证不会传递空值。你不会掉入这样的陷阱。下面的代码抛出NullPointerException (from: 布尔值,条件运算符和自动装箱):

    public static void main(String[] args)抛出异常{ 布尔b = true ?returnsNull(): false;// NPE在这一行。 System.out.println (b); } returnsNull() { 返回null; 代码}< / > < / p > < /李>

  2. 当你需要一个对象时使用布尔值,例如:

    • 布尔流,
    • 可选
    • 布尔值的集合
    • 李< / ul > < / >

Boolean是线程安全的,所以你可以考虑这个因素以及答案中列出的所有其他因素