java中String的字符串常量池和堆空间

本文分析了两段Java代码,分别讨论了字符串连接常量优化和动态赋值的区别。第一段代码中,"hello"+2被优化为"hello2",导致a和b指向同一对象;第二段代码未做优化,a和c指向不同堆内存。通过讲解优化原理和查看.class文件,揭示了字符串操作的内部机制。
摘要由CSDN通过智能技术生成

(1)下面这段代码的输出结果是什么?

  String a = "hello2";   String b = "hello" + 2;   System.out.println((a == b));

  输出结果为:true。原因很简单,"hello"+2在编译期间就已经被优化成"hello2",因此在运行期间,变量a和变量b指向的是同一个对象。

(2)下面这段代码的输出结果是什么?

  String a = "hello2";   String b = "hello"; String c = b + 2; System.out.println((a == c));

  输出结果为:false。由于有符号引用的存在,所以 String c = b + 2;不会在编译期间被优化,不会把b+2当做字面常量来处理的,因此这种方式生成的对象事实上是保存在堆上的。因此a和c指向的并不是同一个对象。

可以通过.class文件(在项目的“out”文件夹下)查看编译后的java代码,同时常量值的编译优化同样可以在.class文件中找到答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值