首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇文章搞清楚boolean到底占几个字节

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

作者头像
微笑的小小刀
发布2020-11-10 10:38:15
3520
发布2020-11-10 10:38:15
举报
文章被收录于专栏:java技术大本营java技术大本营

坚信一点,计算机他就是一个死东西,没有人那么复杂,丁是丁,卯是卯. 不存在说改天就是星期八,晚点聊就是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栈帧中有哪些东西

推荐阅读

一篇文章学透Java八大基本类型

java学习原理篇|如何学习使用一个新工具

java学习应用篇|idea的基本使用

java学习原理篇|java程序运行套路

java学习应用篇|离不开的HelloWorld

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java技术大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 扑朔迷离的byte
  • 就是那些用烂了的手段
  • 待解剖的源码
    • 二板斧:看class文件
      • 三板斧: javap -v
      • 都是同一个意思,就是说法不一样
      • 相关面试题
      • 推荐阅读
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档