我有点扩展提供的答案(因为到目前为止,他们专注于自己的“自己的”/人工术语,专注于对特定语言进行编程,而不是关注创建编程语言的场景背后的大局,一般来说,即当类型安全与内存考虑因素有所不同时):
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 代码说明 bar (boolean) 不能隐式转换(强制转换)为 int。我提出这一点并不是为了说明 JVM 背后的实现细节,而是要指出,就低级别的考虑(如内存大小)而言,人们确实必须更喜欢值而不是类型安全。特别是如果该类型安全没有像在以
形式进行检查的布尔类型那样真正/完全使用
如果值 \in {0,1} 然后转换为布尔类型,否则抛出异常。
只是为了说明 {0,1}
字节不是类型或位
请注意,在内存中,{0,1} 范围内的变量仍将占用至少一个字节或一个字(xbits 取决于寄存器的大小),除非经过特殊处理(例如很好地打包在内存中 - 8 “布尔”位转换为 1 个字节 - 来回)。
通过更喜欢类型安全(例如将值放入/包装到特定类型的盒子中)而不是额外的值打包(例如使用位移位或算术),人们确实可以有效地选择编写更少的代码而不是获得更多的内存。 (另一方面,人们总是可以定义一个自定义用户类型,这将促进所有比布尔值不值的转换)。
关键字与类型
最后,您的问题是关于比较 keyword 与 type。我认为重要的是要解释为什么或如何通过使用/首选关键字(“标记”为primitive)而不是类型(使用另一个关键字class的普通复合用户可定义类)来获得性能
或者换句话说
boolean foo = true;
对比
Boolean foo = true;
第一个“事物”(类型)不能被扩展(子类化)并且不是没有原因的。有效地,primitive 和 wrapping 类的 Java 术语可以简单地转换为 inline 值(一个 LITERAL 或一个常量,只要编译器在可以推断替换,或者如果不是 - 仍然回退到包装值)。
因琐碎而实现优化:
“更少的运行时转换操作 => 更快的速度。”
这就是为什么当实际类型推断完成时,它可能(仍然)最终会在必要时使用所有类型信息实例化包装类(或转换/转换为此类信息)。
所以,boolean 和 Boolean 之间的区别恰恰在于 Compilation 和 Runtime(有点远但几乎就像 instanceof 与 getClass())。
最后,自动装箱比基元慢
请注意,Java 可以做到autoboxing 只是一个“语法糖”。它不会加速任何事情,只是让您编写更少的代码。而已。仍在执行类型信息容器的转换和包装。出于性能原因,请选择始终跳过使用类型信息创建类实例的额外内务处理以实现类型安全的算法。缺乏类型安全是你为获得性能付出的代价。对于具有布尔值表达式的代码,类型安全(当您编写的代码较少,因此 implicit 代码)将是至关重要的,例如用于 if-then-else 流控制。