JVM常量池与String类深入理解

深入理解java String与JVM常量池

创建一个String有二种形式
第一种形式:
String a = "abc";
String b = "abc";
a引用的字符串存放在常量池中,当创建b引用的字符串时,会先从常量池中查找有没有该字符串,如果有,就返回常量池中的字符串。如果没有,就创建该字符串对象并放在常量池中,因为字符串非常常用,jvm为了提高性能和减少内存开销,就会做这些优化
下面再举几个例子
例一
String a = "abc";
String b = "abc";
System.out.println(a == b);
执行上述代码 : 结果为true
a和b引用指向的的都是常量池中同一个String对象的地址
例二
String a = "abc";
System.out.println(a == "abc");
你可能会认为结果为true,不过事情总是没想象的那么简单, 如果使用debug模式,得到的结果为false!
分析:首先实例化了"abc"字符串并存放到JVM的常量池中。
常量池分为编译期常量池和运行时常量池
a == "abc"这段代码里的"abc"是未赋值的的,jvm会对String常量的运算进行优化,未声明的字符串不会在编译器常量池,只有当你运行时才会实例化字符串到运行时常量池中,而声明的a在编译器常量池,所以debug为false。让我们回到print(a == b) //true   print这段代码在JVM编译期可能会跳过,所以,在print内部定义的"abc"是运行期获取的,比较对象地址,结果输出为true;







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值