Java中的布尔与布尔值

Nee*_*eel 173 java boolean

围绕Integervs int在Java中进行了讨论.前者的默认值是null后者的默认值0.Booleanvs boolean?怎么样?

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

Jig*_*shi 249

是的,您可以使用Boolean/ boolean代替.

第一个是Object,第二个是原始类型.

  • 在第一个,您将获得更多有用的方法.

  • 第二个是考虑内存费用 便宜第二个会为你节省更多的内存,所以去吧

现在选择你的方式.

  • 应该注意的是,布尔实际上有3个状态......`true`,`false`和`null`,其中布尔值具有逻辑2状态(`true`和`false`) (84认同)
  • 你可以把它称为"第二个会为你节省更多的内存,所以去吧".布尔的有用方法通常可以在没有实例的情况下调用. (68认同)
  • 布尔是trillean :) (8认同)
  • 布尔值不会保护您对布尔值的任何记忆。Boolean 有两个常量实例,TRUE 和 FALSE,无论您是否使用 Boolean,它们都存在。对象内部的布尔值始终与 VM 的字大小一样大,因此它通常与指向布尔值的引用/指针大小相同。在堆栈上可能会有所不同。但是当它被 jitted 时,可以安全地假设它具有适合 CPU 的机器字的大小。但是:对于非常不同的数组!。 (3认同)
  • 只要您使用新布尔值(值)的Boolean.valueOf(value),内存就不应该成为一个问题. (2认同)
  • 对于 `AsyncTask`,你只能使用 `Boolean` 而不是 `boolean`。 (2认同)

Buh*_*ndi 49

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

boolean result = Boolean.TRUE;
Run Code Online (Sandbox Code Playgroud)

要么

Boolean result = true; 
Run Code Online (Sandbox Code Playgroud)

这基本上是编译器的作用,

Boolean result = Boolean.valueOf(true);
Run Code Online (Sandbox Code Playgroud)

所以,对于你的回答,这是肯定的.

  • 注意:您不能总是安全地将`Boolean`分配给`boolean`.如果你的`Boolean`是'null`并且你试图将它分配给`boolean`,它将在运行时抛出一个`NullPointerException`. (2认同)

Yau*_*ich 34

我有点扩展提供的答案(因为到目前为止他们专注于他们的"自己的"/人工术语,侧重于编程特定的语言,而不是照顾创建编程语言背后的大局,一般来说,即事情像类型安全与内存考虑因素有所不同):

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);
Run Code Online (Sandbox Code Playgroud)

与输出

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true
Run Code Online (Sandbox Code Playgroud)

第3行的Java代码(bar)?1:0说明bar(boolean)不能隐式转换(转换)为int.我提出这个问题并不是为了说明JVM背后的实现细节,而是指出在低级别考虑因素(作为内存大小)方面,我们必须优先考虑值而不是类型安全性.特别是如果这种类型的安全性没有真正/完全使用,就像在布尔类型中那样,检查是以形式完成的

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

所有这些只是说明{0,1} <{ - 2 ^ 31,..,2 ^ 31 -1}.好像有点矫枉过正了吧?类型安全在用户定义的类型中非常重要,而不是隐式转换基元(尽管最后一个包含在第一个中).

字节不是类型或位

请注意,在内存中,{0,1}范围内的变量仍然至少占用一个字节或一个字(xbits取决于寄存器的大小),除非特别注意(例如,在内存中很好地打包 - 8"boolean"位为1个字节 - 来回).

通过优先考虑类型安全性(如将值/包装到特定类型的盒子中)通过额外的值包装(例如使用位移或算术),人们确实选择编写更少的代码而不是获得更多的存储器.(另一方面,人们总是可以定义一个自定义用户类型,这将促进所有转换不值得比布尔值).

关键字与类型

最后,您的问题是关于比较关键字类型.我认为通过使用/首选关键字("标记为" 原语)而非类型(使用其他关键字类的普通复合用户可定义类)或换句话说,解释为什么或如何通过使用/首选关键字("标记为原始")来获得性能非常重要

boolean foo = true;
Run Code Online (Sandbox Code Playgroud)

Boolean foo = true;
Run Code Online (Sandbox Code Playgroud)

第一个"东西"(类型)不能扩展(子类)而不是没有理由.有效地,原始包装类的Java术语可以简单地转换为内联值(LITERAL或常量,只要有可能推断替换,就可以直接由编译器替换,或者如果不是 - 仍然回退到包装值).

由于微不足道,优化得以实现:

"减少运行时转换操作=>更快的速度."

这就是为什么当实际的类型推断完成时,它可能(仍)最终在必要时用所有类型信息实例化包装类(或转换/转换成这样的类型信息).

因此,布尔值布尔值之间的区别恰好在编译运行时(有点远,但几乎与instanceof对比getClass()).

最后,自动装箱比原始装置慢

请注意,Java可以进行自动装箱只是一种"语法糖".它不会加快任何速度,只允许你编写更少的代码.而已.仍然执行铸造和包装到类型信息容器中.出于性能原因,选择算术,它总是会跳过使用类型信息创建类实例的额外内务来实现类型安全.缺乏类型安全性是您为获得性能而付出的代价.对于具有布尔值表达式类型的代码,安全性(当您编写较少且因此隐式代码时)对于if-then-else流控制来说将是至关重要的.


Coo*_*ans 16

您可以使用布尔常量 - Boolean.TRUEBoolean.FALSE不是01.boolean如果原语是您所追求的,您可以创建类型的变量.这样您就不必创建新Boolean对象.


Sud*_*ari 6

一个观察:(虽然这可以被认为是副作用)

boolean是一个原始类型,可以说是或否。

Boolean是一个对象(它可以指是或否或“不知道”即空)


小智 5

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

boolean b1;
Boolean b2;
Run Code Online (Sandbox Code Playgroud)

b1并且b2不一样。