Java常量池

概述

         常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值。可以看做是JVM中一块特殊的内存空间。

        比如下面小段源码中粗体代码显示的部分:

        public class ClassTest {
             private String itemS ="我们 ";
             private final int itemI =100 ;
             public void setItemS (String para ){...}
        }

String与常量池
        例1:
        String s0="kvill";
        String s1="kvill";
        String s2="kv" + "ill";

        System.out.println( s0==s1 );     // true
        System.out.println( s0==s2 );     //true

      首先,我们要知道Java会确保一个字符串常量只有一个拷贝。

      因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。

      所以我们得出s0==s1==s2;

     用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。

     例2:
        String s0 = "kvill";

        String s1 = new String("kvill");

        String s2 = "kv" + new String("ill");

        System.out.println(s0 == s1);   //false

        System.out.println(s0 == s2);   //false

        System.out.println(s1 == s2);   //false

       例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。

       补充:关于equals和==

       equals这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;

       ==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。也用来比较两个基本数据类型的变量值是否相等

八种基本类型和常量池

        java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用常量池,也即对象不负责创建和管理大于127的这些类的对象。详见《int 和 Integer的区别》。

        //5种整形的包装类Byte,Short,Integer,Long,Character的对象,
        //在值小于127时可以使用常量池
        Integer i1=127;
        Integer i2=127;
        System.out.println(i1==i2); //输出true
        //值大于127时,不会从常量池中取对象
        Integer i3=128;
        Integer i4=128;
        System.out.println(i3==i4); //输出false
        
        //Boolean类也实现了常量池技术
        Boolean bool1=true;
        Boolean bool2=true;
        System.out.println(bool1==bool2); //输出true
        
        //浮点类型的包装类没有实现常量池技术
        Float f1=1.0f;
        Float f2=1.0f;
        System.out.println(f1==f2); //输出false

        Double d1=1.0;
        Double d2=1.0;
        System.out.println(d1==d2); //输出false



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值