您的位置:首页 > 编程语言 > Java开发

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

2018-03-21 01:24 423 查看

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。将此数据类型用于跟踪真/假条件的简单标志。这种数据类型代表了一位的信息,但其“大小”并不是精确定义的。



官方给出的说明是其大小不是精确定义的[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 LotsOfIn
4000
ts: " + (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位。

完美,收工!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: