JVM对boolean类型的支持比较有意思,java虚拟机规范里这样说:
Although the Java virtual machine defines a boolean
type, it only provides very limited support for it. There are no Java virtual machine instructions solely dedicated to operations on boolean
values. Instead, expressions in the Java programming language that operate on boolean
values are compiled to use values of the Java virtual machine int
data type.
The Java virtual machine does directly support boolean
arrays. Its newarray instruction enables creation of boolean
arrays. Arrays of type boolean
are accessed and modified using the byte
array instructions baload and bastore.
实际测试了一下,代码:
-
-
-
publicclassTest{
-
publicstaticvoidmain(String[]args){
-
booleanb=true;
-
booleanb1=false;
-
boolean[]bs={true,false,false,true};
-
int[]array=newint[3];
-
byte[]bytes=newbyte[3];
- System.out.println(bs.getClass());
- System.out.println(array.getClass());
- System.out.println(bytes.getClass());
- }
- }
输出是:
class [Z
class [I
class [B
对于boolean数组类型,内部表示为[Z,和byte[]的[B还是有差别的.
看实际字节码操作:
-
0:iconst_1 //true用1表示
-
1:istore_1
-
2:iconst_0 //false用0表示
-
3:istore_2
-
4:iconst_4
-
5:newarrayboolean //boolean数组
-
7:dup
-
8:iconst_0
-
9:iconst_1
-
10:bastore
-
11:dup
-
12:iconst_1
-
13:iconst_0
-
14:bastore
-
15:dup
-
16:iconst_2
-
17:iconst_0
-
18:bastore
-
19:dup
-
20:iconst_3
-
21:iconst_1
-
22:bastore
-
23:astore_3
-
24:iconst_3
-
25:newarrayint
-
27:astore4
-
29:iconst_3
-
30:newarraybyte
-
32:astore5
从上面可以看出对boolean数组的操作使用的是bastore,也就是操作byte 数组的指令.
ps:分析这个问题的时候,使用了两个反编译工具jad和jd-gui,发现它们对boolean,short,byte,char这些类型处理的时候都是存在问题的.
分享到:
相关推荐
- JVM的规范确保了所有实现对这些数据类型的解释是一致的,确保了数据类型的可移植性。 4. **JVM规格描述** - JVM规格详细定义了虚拟机的各个方面,包括内存模型、类加载机制、执行引擎、垃圾收集算法等。开发者...
- `boolean`:虽然JVM没有为`boolean`类型设置专门的指令,但在实现中通常使用整数指令来处理布尔值。 除了上述基本类型外,JVM还支持: - **对象引用**: - `object`:指向一个Java对象的4字节引用。在某些实现...
JVM定义了两种数据类型:原始类型(如int、char、boolean等)和引用类型(如类、接口和数组)。原始类型在内存中直接存储值,而引用类型存储的是对象的引用地址。 3. 类文件格式: Java源代码编译后生成.class...
对于boolean类型,虽然没有专门的指令,但通常使用integer指令处理。浮点数遵循IEEE754标准。 在JVM规格描述中,每个实现必须严格遵守类型规定,确保执行的字节码程序符合类型安全。此外,JVM的内存管理,尤其是...
- JVM支持8种基本数据类型:byte、short、int、long、float、double、char和boolean。其中,boolean通过integer指令处理,数组被视为object类型。 - **对象引用**:object类型代表对Java对象的引用,包含对方法表...
- **基本类型**:包括`byte`, `short`, `int`, `long`, `char`, `float`, `double`, `boolean` 和 `returnAddress`。这些类型用于存储原始值,如整数、浮点数等。 - **引用类型**:包括类类型、接口类型和数组。这类...
在Java虚拟机(JVM)指令集中,指令被用来执行基本的算术、类型转换、对象创建和操作、方法调用等任务。JVM指令集设计为平台无关,这样同一个类文件可以在任何实现了Java虚拟机规范的平台上运行。JVM指令是基于操作...
这些包括将byte或boolean类型值存入数组的bastore,int类型的iastore,long类型的lastore,以及对于引用类型值的aastore指令。这些数组存储指令的用途是将计算或操作结果存入数组的相应位置中。 由于文档部分文字...
在Java中,基本类型包括byte、short、int、long、char、float、double和Boolean,引用类型包括类类型、接口类型和数组类型。 接下来,文档阐述了堆与栈的区别和重要性。栈是程序运行时的单位,负责处理程序的执行...
JVM指令还提供了对数组的访问和修改功能,如`baload`加载byte或boolean数组元素,`caload`加载char数组元素,`saload`加载short数组元素。这些指令与对应的`iaload`等一起,构成了对数组元素的全面操作。 4. 字节...
基本数据类型包括八种基本类型,如byte、short、int、long、char、float、double、Boolean。这些基本类型的变量直接保存值,而非引用。引用数据类型包括类类型、接口类型、数组类型,它们存储的是对象的引用,也就是...
`iaload`用于装载`int`类型的数组元素,`laload`用于`long`类型,`faload`用于`float`类型,`daload`用于`double`类型,`aaload`用于对象引用类型,`baload`用于`byte`或`boolean`类型,`caload`用于`char`类型,`...
JVM 栈是线程私有的,每个线程创建的同时都会创建 JVM 栈,JVM 栈中存放的为当前线程中局部基本类型的变量(java 中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果...
基本类型包括byte、short、int、long、char、float、double和Boolean,以及在某些特定情况下使用的returnAddress,它们在内存中直接存储原始值。引用类型则包含类类型、接口类型和数组,它们不存储实际的对象,而是...
本文将围绕JVM调优展开讨论,重点分析数据类型、堆与栈的关系及其对程序性能的影响,并探讨Java中的参数传递机制。 #### 二、数据类型 在Java虚拟机中,数据类型分为两大类:基本类型和引用类型。 - **基本类型**...
每条指令都是一个字节长度的操作码(opcode),后面跟着零个或多个操作数(operand),用于对JVM栈上的数据进行操作。 助记符是一种为指令提供的易于记忆的符号表示形式,它帮助开发者通过更容易理解的方式编写和...
基本类型包括:byte、short、int、long、char、float、double、boolean。引用类型包括类类型、接口类型和数组。理解这些数据类型对于理解JVM的内存分配和垃圾回收至关重要。 3. 堆与栈的区别 堆和栈是程序运行过程...
基本类型包括byte、short、int、long、char、float、double、Boolean、returnAddress等,引用类型包括类类型、接口类型和数组。 在Java中,堆和栈是程序运行的关键概念。栈是运行时的单位,而堆是存储的单位。栈...