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位。
完美,收工!!!
相关文章推荐
- 你真的知道Java中boolean类型占用多少个字节吗?
- Java中boolean类型占用多少个字节
- Java中boolean类型占用多少个字节
- 你真的知道Java中boolean类型占用多少个字节吗?
- 你真的知道Java中boolean类型占用多少个字节吗?
- Java中boolean类型占用多少个字节
- Java中boolean类型到底占用多少个字节?
- JAVA 中的几种基本数据类型是什么,各自占用多少字节。
- Java中boolean类型占用多少个字节
- java如何判断一个String类型数据由多少字节组成?
- java中 boolean类型占多少字节
- java boolean类型占多少字节
- java中8中基本数据类型占用字节空间
- Java 中八种基本数据类型占用字节空间总结
- Java基本数据类型占用字节和范围
- java中的基本数据类型?各占多少位?多少字节?取值范围?
- Java的基本数据类型各占多少个字节
- Java中八种基本数据类型占用字节空间总结和数据类型之间的转换
- java c++ 基本数据类型占用字节空间
- java中的基本数据类型?各占多少位?多少字节?取值范围?