从字节码理解String与字符串常量池

Java程序员相必都知道或者应该需要知道String的值是存在一个叫字符串常量池的数据结构内的,如果常量池内有字符串“AA”,这是之前一次赋值字符串String b = “AA”的时候产生的,那么你再写String a="AA"的时候,并没有新生成一个字符串,而是a指向了常量池中的那个字符串,从而得到a==b为true的情况。假如String a = new String("AA")则不是,同时String c = “A”+“A”也是等价于a的。
以上是教科书的内容或者笔试题硬背的姑且不论,我们通过javap命令来实际感受下为什么会这样,关于javap命令的知识请参考这个博主的。

  1. 测试类内容
public class TTTT {
    public static void main(String[] args) {
        String ss = "sssssss";
        String sss = "ss"+"sssss";
        String ssss = new String("sssssss");
    }
}
  1. 查看常量池(javap -verbose)
    首先声明这不是查看常量池的命令,只是能看到常量池而已,截图如下
    这里写图片描述
    可以看到常量池中有个 #16是个字符串sssssss,也只存在这一个字符串。
  2. 查看类的字节码(javap -c)
    这里写图片描述

可以看到0~2,3~5是一样的,指向同一个常量池中的字符串,另外6~10new出来的有new 、dup的步骤,具体意思请移步字节码指令列表

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值