JVM-常量池

发布时间 2023-12-02 23:55:42作者: 轻寒

概要:

1.Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte、Short、Integer、Long、Character、Boolean;
2.且数值 [-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。
3.两种浮点数类型的包装类 Float、Double 并没有实现常量池技术。

实例:

     Integer i = 1;
        double d2 = 1.0;
        /**
         * 有小数点的时候必须加上f后缀
         * 编译器可以自动向上转型,如int 转成 long 系统自动转换没有问题,因为后者精度更高
         * byte--short--char--int--long--float--double,由左到右等级升高,double为最高级;
         * double 转成 float 就不能自动做了,所以后面的加上个 f;也就是说必须写成float f=(float)3.4 或float f = 3.4f
         */
        float f2 = 1.0f;
        Double d3 = 1.0;
        /**
         * true
         * 常量池技术
         */
        System.out.println(i == d2);
        System.out.println(i == f2);

        /**
         * false
         */
        System.out.println(i.equals(d3));

        Integer i1 = 33;
        Integer i2 = 33;
        /**
         * 输出true
         */
        System.out.println(i1 == i2);
        Integer i11 = 128;
        Integer i22 = 128;
        /**
         * 输出false
         * 范围是-128到127
         */
        System.out.println(i11 == i22);
        Double i3 = 1.2;
        Double i4 = 1.2;
        /**
         * 输出false
         */
        System.out.println(i3 == i4);


        String a = "11";
        String b = "11";
        /**
         * 输出true
         * 因为只在常量池创建了对象
         * 对于字符串:其对象的引用都是存储在栈中的,
         * 如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,
         * 如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,
         * 在常量池中永远只有一份,在堆中可能有多份。
         */
        System.out.println(a == b);

        String c = new String("129222");
        String d = new String("129222");
        /**
         * 输出false
         */
        System.out.println(c == d);