字符串常量池

特点

1 只要是双引号引起来的字符串都存储在常量池中

2 每次存储字符串的时候,先检查常量池是否有该字符串,如果没有则存储,有则直接使用常量池中的字符串。

示例一:

字符串String由两部分组成,value(存储常量池中的字符的地址)和hash(保存字符的Ascall码值)。

比如hello在常量池中的地址为0x78,那么指向hello的String对象的value就是0x78.

按照上图和代码进行分析。

s1和s2并没有创建新的String对象,s1,和s2的地址相同,都指向的是常量池中的String对象。

s3,s4,s5均创建了新的对象,其创建的String对象的value指向常量池字符串。因此s3,s4,s5保存的是各自对象的地址。

如果太复杂,可以简单理解为:

s1----->常量池中的字符

s3----->创建的String对象------>常量池字符

当hello第一次出现的时候,系统先会在常量池中是否存有hello,如果没有那么就在常量池中存储hello,当第二次使用hello的时候,这时在常量池中可以找到hello,hello就不需要在存储了。即常量池不会重复存储相同字符。

示例二

intern

再来看这两张图,我们要注意,s1中会创建新的对象,这个对象指向的是一个字符数组,并不会存储在常量池中,只有s2的“abc”会存储在常量池里。

但是当我们用intern的方法后:

此时结果为true。

添加了intern是把s1创建的字符串对象加入到了常量池中,此时s2可以在常量池中找到abc这个字符串对象,因此相同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值