新闻资讯

新闻资讯 媒体报道

一篇文章搞清楚boolean到底占几个字节

编辑:005     时间:2020-11-10

扑朔迷离的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一样,有一个字节.

本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐