Java中boolean数据类型占用多少个字节

Java中boolean数据类型占用多少个字节

在Java中一共有八种数据类型,未精确定义字节(Boolean),1字节(byte),2字节(short,char),4字节(float,int),8字节(long,double):

  • Boolean到底占多少字节?
  • 参考 Stack Overflow
  • 参考 late 2017 JavaDocs
  • 参考 CSDN各位大神

首先,我们从JavaDocs开始说

在基础类型中说道:boolean数据类型只有两个可能的值:true和false。将此数据类型用于跟踪真/假条件的简单标志。这种数据类型代表了一位的信息,但其“大小”并不是精确定义的。
Java中boolean数据类型占用多少个字节_第1张图片

官方给出的说明是其大小不是精确定义的[This data type represents one bit of information, but its “size” isn’t something that’s precisely defined.]

然后网上也是各种测试验证其所占的字节大小。

然后,我们从Stack Overflow上网友的测试来说

package day20180321;

public class TestBoolean {
    private static final int SIZE_TEST = 1000000;

    public static void main(String[] args) throws Exception
    {        
        LotsOfBooleans[] first = new LotsOfBooleans[SIZE_TEST];
        LotsOfInts[] second = new LotsOfInts[SIZE_TEST];

        System.gc();
        long startMem = getMemory();

        for (int i=0; i < SIZE_TEST; i++)
        {
            first[i] = new LotsOfBooleans();
        }

        System.gc();
        long endMem = getMemory();

        System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE_TEST)));

        System.gc();
        startMem = getMemory();
        for (int i=0; i < SIZE_TEST; i++)
        {
            second[i] = new LotsOfInts();
        }
        System.gc();
        endMem = getMemory();

        System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE_TEST)));

        // Make sure nothing gets collected
        long total = 0;
        for (int i=0; i < SIZE_TEST; i++)
        {
            total += (first[i].a0 ? 1 : 0) + second[i].a0;
        }
        System.out.println(total);
    }

    private static long getMemory()
    {
        Runtime runtime = Runtime.getRuntime();
        return runtime.totalMemory() - runtime.freeMemory();
    }
}

我的jdk版本是jdk1.7.0_72,运行出来的结果是

Size for LotsOfBooleans: 47960928
Average size: 47.960928
Size for LotsOfInts: 167999952
Average size: 167.999952
0

其测试结果显示,一个Int类型的数据是一个Boolean类型数据的3.5倍,也就是基本上4倍,由此,基本上可以说,Boolean类型数据所占1字节。

然后的然后,我们从书上来说

《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”

正好恰到好处的应正了其实验的正确性。

然后的然后的然后,我们从计算机底层方面来说

大家都知道当时都是开发32位的JVM,那时候32位的CPU处理一条指令是32位的,也就是四个字节,这样具有高效存取得作用。

例如在隐示转换中,byte、short、char类型的数据都是直接自动转换到int类型,为什么?

package day20180321;

public class Test{

    public static void main(String[] args) {

        System.out.println("byte="+Byte.SIZE+" bit");
        System.out.println("short="+Short.SIZE+" bit");
        System.out.println("char="+Character.SIZE+" bit");
        System.out.println("int="+Integer.SIZE+" bit");
        System.out.println("flot="+Float.SIZE+" bit");
        System.out.println("long="+Long.SIZE+" bit");
        System.out.println("double="+Double.SIZE+" bit");

    }

}

Result:
byte=8 bit
short=16 bit
char=16 bit
int=32 bit
flot=32 bit
long=64 bit
double=64 bit

上述代码得到相应数据的位数。

对于32位的处理器来说,低于32位的数据类型(像byte、short、char)直接转换成32位(像 Int)更方便,后期就不需要在不够补齐了(二进制中的补齐),这样JVM的速度就会更快,像高于32位的数据类型,也就是64位的数据,会分为两个32位进行执行。

这样来说的话,呼应前面的实验,我们用Int(32位)来测试对比Boolean是合理的。

最后,胡乱的瞎扯神鬼说

byte=8 bit
short=16 bit
char=16 bit
int=32 bit
flot=32 bit
long=64 bit
double=64 bit

看到上面基础数据类型的位数,又发现什么吗?

8,16,16,32,32,64,64

这样一串数字,很明显少了一个8,其他都是成双成对,就只有byte一个人孤零零的拥有8位,这时候,想想还差谁,不就是还差Boolean,正好测试的估计也是8位。

完美,收工!!!


你可能感兴趣的:(Java)