坚信一点,计算机他就是一个死东西,没有人那么复杂,丁是丁,卯是卯. 不存在说改天就是星期八,晚点聊就是 25 点.
扑朔迷离的 byte
在写完上一篇之后,八大类型之后,其实关于 byte 占几个字节这个问题,我只是查了资料做了整理,自己也并未深入去研究一下,但我也一直没有忘记这个事.所以今天
和大家一起来深入讨论一下 byte.
就是那些用烂了的手段
记得是很久很久以前,我印象中我是写过的.就是学习 java,往深处学,就是 1.看源码.2.看 class 文件. 3.就是 javap -v . 经此三板斧, 再没解决... 算了,放弃吧, 这个知识点不值得(或者看看以前我们讲的 hsdb )
待解剖的源码
public static void main(String[] args) {
// 平淡无奇的赋值
boolean a = true;
// 平淡无奇的声明数组
boolean[] bArray = new boolean[2];
// 平淡无奇的给数组赋值
bArray[0]=true;
bArray[1]=true;
// 平淡无奇的输出
System.out.println(a);
System.out.println(bArray);
}
二板斧:看 class 文件
public static void main(String[] args) {
boolean a = true;
// 也就是帮我们精简了一下数组的新建和赋值
// 学了一种写法
boolean[] bArray = new boolean[]{true, true};
System.out.println(a);
System.out.println(bArray);
}
三板斧: javap -v
javap 这是一个神奇的命令,可以看到代码对应的虚拟机指令,很多难以理解的概念,比如说
synchronized
,i++
, 等都可以借助 javap 来理解.
这里我们在 .class 文件的目录执行 javap -v 之后可以看到如下的内容,这里选取了 main 函数相关的执令.
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=3, args_size=1
0: iconst_1
1: istore_1
2: iconst_2
3: newarray boolean
5: astore_2
6: aload_2
7: iconst_0
8: iconst_1
9: bastore
10: aload_2
11: iconst_1
12: iconst_1
13: bastore
14: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
17: iload_1
18: invokevirtual #3 // Method java/io/PrintStream.println:(Z)V
21: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
24: aload_2
25: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
28: return
LineNumberTable:
line 20: 0
line 22: 2
line 24: 6
line 25: 10
line 27: 14
line 28: 21
line 29: 28
LocalVariableTable:
Start Length Slot Name Signature
0 29 0 args [Ljava/lang/String;
2 27 1 a Z
6 23 2 bArray [Z
在这里, 我们首先要做的就是把指令的源代码对应上.
都是同一个意思,就是说法不一样
-
今天我写了 Java 代码
-
今天我把 Java 代码写了
-
今天 Java 代码被我写了
上面这三句话,意思都是同一个意思, 只是说法不一样, 在我们写程序时也是如此. 同一个程序我们用源码写了一遍, 然后又被解析成 .class , 最终被解析成指令,最后到 cpu 指令.都是在描述同一件事情.以上面源码为例, 我们在这里做了一个双语对照
// 平淡无奇的赋值
// 0: iconst_1
// 1: istore_1
boolean a = true;
// 平淡无奇的声明数组
// 2: iconst_2
// 3: newarray boolean
// 5: astore_2
boolean[] bArray = new boolean[2];
// 平淡无奇的给数组赋值
// 6: aload_2
// 7: iconst_0
// 8: iconst_1
// 9: bastore
bArray[0]=true;
// 10: aload_2
// 11: iconst_1
// 12: iconst_1
// 13: bastore
bArray[1]=true;
// 平淡无奇的输出
System.out.println(a);
System.out.println(bArray);
通过上面的对照可以看到, 在对单个 boolean 进行赋值的时候,使用的是 istore
这个指令 ,在对 boolean 数组中的元素赋值时,使用的是 bastore
这个指令,下面两图摘抄自 oracle 官方文档:
https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-6.html#jvms-6.5.istore
所以,我们有了以下结论:
单个的 boolean 值是和 int 一样,有四个字节.
boolean 数组中的值是和 byte 一样,有一个字节.
相关面试题
1。jvm 栈帧中有哪些东西
推荐阅读
关于小刀
1。自封的初级 java 劝退师
2。自封的微信号:best396975802
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于