zoukankan      html  css  js  c++  java
  • java boolean 大小

    先看官方文档

    Primitive Data Types

    The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases.
    ...
    boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.
    

    从以上内容我们可以得知JAVA规范中没有定义boolean类型的大小。

    这在stackoverflow中的这个问题有所提及

    What is the size of a boolean variable in Java?

    这里讲到

    It's virtual machine dependent. // 由虚拟机自己实现
    

    而我在其他地方查到了如下资料:

    根据:(JVM规范第2版 3.3.4节)

    Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type. 
    Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding. 而:Java virtual machine type int, whose values are 32-bit signed two's-complement integers。
    Arrays of type boolean are accessed and modified using the byte array instructions 
    In Sun's JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element.
    

    因此,java的基本数据类型中,boolean只有两种状态,默认值为false.取值范围是{true,false},理论上占1bit,实际上:

    1. 单个的boolean 类型变量在编译的时候是使用的int 类型。
    boolean b = true; // 这个b在JVM中占4个字节即:32位
    
    1. boolean 类型的数组时,在编译的时候是作为byte array来编译的所以boolean 数组里面的每一个元素占一个字节(8位)
    boolean[] b = new boolean[10]; // 数组时,每一个boolean在JVM中占一个字节。
    

    验证

    class LotsOfBooleans
    {
        boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
        boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
        boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
        boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
        boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
    }
     
    class LotsOfInts
    {
        int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
        int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
        int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
        int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
        int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
    }
     
     
    public class Test
    {
        private static final int SIZE = 100000;
     
        public static void main(String[] args) throws Exception
        {        
            LotsOfBooleans[] first = new LotsOfBooleans[SIZE];
            LotsOfInts[] second = new LotsOfInts[SIZE];
     
            System.gc();
            long startMem = getMemory();
     
            for (int i=0; i < SIZE; 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)));
     
            System.gc();
            startMem = getMemory();
            for (int i=0; i < SIZE; 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)));
     
            // Make sure nothing gets collected
            long total = 0;
            for (int i=0; i < SIZE; 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();
        }
    
    }
    
    /Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=54327:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/apple/code/learning-demo/demo/out/production/untitled:/Users/apple/code/learning-demo/demo/lib/kotlin-stdlib.jar:/Users/apple/code/learning-demo/demo/lib/kotlin-reflect.jar:/Users/apple/code/learning-demo/demo/lib/kotlin-test.jar:/Users/apple/code/learning-demo/demo/lib/kotlin-stdlib-jdk7.jar:/Users/apple/code/learning-demo/demo/lib/kotlin-stdlib-jdk8.jar bigdata.Test
    Size for LotsOfBooleans: 9483568
    Average size: 94.83568
    Size for LotsOfInts: 33599832
    Average size: 335.99832
    0
    
    Process finished with exit code 0
    

    测试结果

    openjdk 11.0.2
    
    boolean 32位(int)
    boolean[] 8位(byte)
    
  • 相关阅读:
    spring boot整合使用mybatis
    spring boot整合使用jdbcTemplate
    spring boot全局捕获异常
    springboot 静态资源访问
    spring boot项目的启动方式
    第一个spring boot项目 springboot-helloworld
    ASP.Net MVC 登录授权验证
    C# mysql 事务处理
    无法删除数据库,因为该数据库当前正在使用"问题解决
    mysql 按照小时去除一段时间内的不同状态数据统计
  • 原文地址:https://www.cnblogs.com/lifan1998/p/14326560.html
Copyright © 2011-2022 走看看