Java 的基本类型
Java除了对象外,还有八个基本类型来支持数值计算;使用基本类型能够在执行效率以及内存使用两方面提升软件性能。
- 如图示,前面的值域被后面的值域所包含,因此由前面的基本类型转换为后面的强制类型不需要强制转换。尽管其默认值看起来不同,但在内存中都是0。
- boolean 和 char 是唯二的无符号类型。在遵守规范的情况下,前者取值在 0 或 1 之间,猴子则在 [0,65535]。
基本类型在Java虚拟机中的实现
例:Java 虚拟机的 boolean 类型
- Java 语言规范和Java 虚拟机规范对 boolean 类型的定义:
在Java语言规范中,boolean类型的值只有两者可能(true/false),这两者不能被虚拟机直接使用。
在Java虚拟机规范中,boolean类型被映射成了int类型(true —> 1,false —> 0)。
浮点类型
浮点类型比较特殊。基于它的运算或比较,需要考虑 +0.0F、-0.0F 以及 NaN 的情况。
- Java 的浮点类型采用 IEEE 754 浮点数格式。以 float 为例,浮点类型通常有两个 0,+0.0F 以及 -0.0F。尽管它们的内存数值不同,但是在 Java 中 +0.0F == -0.0F 会返回真。
- 可以定义浮点数中的正无穷及负无穷。正无穷就是任意正浮点数(不包括 +0.0F)除以 +0.0F 得到的值,而负无穷是任意正浮点数除以 -0.0F 得到的值。在 Java 中,正无穷和负无穷是有确切的值,在内存中分别等同于十六进制整数 0x7F800000 和 0xFF800000。
- [0x7F800001, 0x7FFFFFFF]和[0xFF800001, 0xFFFFFFFF]对应的都是 NaN。当然,一般我们计算得出的 NaN,比如说通过 +0.0F/+0.0F,在内存中应为 0x7FC00000。这个数值,我们称之为标准的 NaN,而其他的我们称之为不标准的 NaN。
- NaN 有一个特性:除了“!=”始终返回 true 之外,所有其他比较结果都会返回 false。
基本类型在栈与堆中的比较。
- 除 long 和 double 外,其他基本类型与引用类型在解释执行的方法栈帧中占用的大小是一致的,但它们在堆中占用的大小却不同。
- 在将 boolean、byte、char 以及 short 的值存入字段或者数组单元时,Java 虚拟机会进行掩码操作。在读取时,Java 虚拟机则会将其扩展为 int 类型。(堆中)