【JVM】Java字符串常量

Java字符串常量

静态常量池指的是class字节码中,声明的常量部分

Test1

代码

public class Main {
    private static final String filedA = "a";
    public static void main(String[] args) {
        String filedB = "b";
    }
}

javap 反编译后结果

   #5 = Utf8               filedA
  #20 = Utf8               filedB
  #24 = Utf8               b
  #27 = Utf8               a

Test2

代码

public class Main {
    private static final String filedA = "a" + "b";
    public static void main(String[] args) {
        String filedB = "b";
    }
}

javap 反编译后结果

   #5 = Utf8               filedA
  #20 = Utf8               filedB
  #24 = Utf8               b
  #27 = Utf8               ab

Test3

代码

public class Main {
    public static void main(String[] args) {
        String filedA = "a";
        String filedB = "b";
        String filedC = filedA + filedB;
        String filedD = filedA + "c";
    }
}

javap 反编译后结果

  #22 = Utf8               filedA
  #24 = Utf8               filedB
  #25 = Utf8               filedC
  #26 = Utf8               filedD
  #30 = Utf8               a
  #31 = Utf8               b
  #35 = Utf8               c

由结果看出,filedC的值(ab)和filedD的值(ac)并没有出现在常量池中,由+号直接对字符串连接的,常量池中直接放连接后的结果,由+号对常量的引用进行连接的,常量池中不会放入计算结果

Test4

代码

public class Main{
    public static void main(String[] args){
        String filedA = "a";
        String filedB = new String("a");
        String filedC = new String("b");
        System.out.println(filedA==filedB);// 运行后结果为false
    }
}

javap 反编译后结果

  #21 = Utf8               filedA
  #23 = Utf8               filedB
  #24 = Utf8               filedC
  #32 = Utf8               a
  #35 = Utf8               b

new的过程会创建一个对象,filedB和filedC的值是一个引用地址,而filedA的值是一个字面量,所以filedA==filedB的结果为false

intern()用法

代码

public class Main {
    public static void main(String[] args){
        String filedA = "a";
        String filedB = new String("a");
        System.out.println(filedA==filedB); // false
        String filedC = filedB.intern();
        System.out.println(filedA==filedC); // true
    }
}

intern的作用是,初始化的时候,从常量池取值,常量池中存在就从常量池中获取,不存在就创建一个,然后返回常量池中的值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值