围绕Integervs int在Java中进行了讨论.前者的默认值是null后者的默认值0.Booleanvs boolean?怎么样?
我的应用程序中的变量可以有0/ 1值.我想使用boolean/ Boolean而不想使用int.我可以使用Boolean/ boolean代替吗?
Jig*_*shi 249
是的,您可以使用Boolean/ boolean代替.
第一个是Object,第二个是原始类型.
在第一个,您将获得更多有用的方法.
第二个是考虑内存费用 的便宜第二个会为你节省更多的内存,所以去吧
现在选择你的方式.
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)
所以,对于你的回答,这是肯定的.
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流控制来说将是至关重要的.
小智 5
基本上,布尔值表示原始数据类型,其中布尔值表示引用数据类型。这个故事是从Java想要成为纯粹面向对象的时候开始的,它提供了包装类概念来克服原始数据类型的使用。
boolean b1;
Boolean b2;
Run Code Online (Sandbox Code Playgroud)
b1并且b2不一样。
| 归档时间: |
|
| 查看次数: |
270423 次 |
| 最近记录: |