String的intern()方法疑问,已解决

用的jdk1.8
请看下面的截图
在这里插入图片描述
在这里插入图片描述
当我不声明a字符串时,s==s.intern() 为true,声明了以后却为false,什么原因?

首先 new StringBuilder(“aa”).append(“a”),在编译时常量池就存在了 “aa"和"a”,但是不存在"aaa",s的指向"aaa"在堆中的地址,首次调用s.intern()会在常量池中加入"aaa",并返回s的引用,所以为true,当声明a="aaa"时,会直接去常量池找有没有,有的话,a变量就直接指向“aaa”在常量池中的地址,第二次调s.intern也是指向的常量池中的地址,所以为false

确定的字符串在编译器就已经在常量池存在引用了,所以 new StringBuilder(“aaa”).toString() 和 new StringBuilder().append(“aaa”).toString() 效果是一样的,运行System.out.println(s==s.intern()) 一定是false ,因为编译期常量池就存在了"aaa"。 而new StringBuilder(“aa”).append(“a”).toString();在编译器只存在"aa" 和 “a”, s的值只存在堆中,s.intern()会在常量池加载"aaa"并返回a的引用,所以比较结果为true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值