谢红波 2012-09-24 23:35
浏览 601
已采纳

java中boolean类型到底是1bit还是1byte?

我在网上找过很多资料,有说1bit的也有说1byte的。
于是,
我自己想了个证明大小的办法如下
public static void main(String[] args) {
int _1_MB = 1024*1024;
boolean[] b = new boolean[_1_MB*10];

    System.out.println("no excption");
}

申请包含10M个boolean的数组,如果boolean是1byte的话,那么大小就刚好是10M
如果是1bit的话,大小就应该是10/8M,然后加上虚拟机参数Xmx9来运行这个程序,最后结果是内存溢出,11的时候不溢出。以此我判定boolean是1byte也就是8bit。
另外,把boolean换成byte,得到的结果是相同的,更证明boolean和byte的占位是一致的,

我对此一直深信事实胜于雄辩,于是乎,网上那些众说纷纭也就不以为然。
直到我今天在一本书上看到说boolean是1bit的,(肯定不是单位有误,因为后面一句是byte是8bit)。

所以烦劳大神给个官方权威的资料来解释。
如果结果真是1bit,为什么会跟我的测试程序有冲突。没多少分了,所以我就吝啬一点

  • 写回答

2条回答 默认 最新

  • jinnianshilongnian 2012-09-25 04:59
    关注

    boolean 值为 1/0 逻辑上占1bit 但实际上要看虚拟机 并没有精确定义;如hotspot:

    boolean i = true; //此时在栈上分配,为int类型(既要看虚拟机内部的实现),即true用int 1 false用int 0表示 虚拟机内部没有boolean类型;
    字节码:
    iconst_1 压入int常量1
    istore_2 存i

    boolean[] i = new boolean[10]; //此时在堆上分配,数组元素在为byte类型
    7: aload_1
    8: iconst_0
    9: iconst_1
    10: bastore //bastore b代表byte

    摘自 《Java虚拟机规范(Java SE 7)》
    [quote]2.3.4 boolean类型
    虽然 Java 虚拟机定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在
    Java 虚拟机中没有任何供 boolean 值专用的字节码指令,在 Java 语言之中涉及到 boolean
    类型值的运算,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替。
    Java 虚拟机直接支持 boolean 类型的数组,虚拟机的 newarray 指令可以创建这种数组。
    boolean 的数组类型的访问与修改共用 byte 类型数组的 baload 和 bastore 指令①。 [/quote]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)