StringTable(字符串常量池)

注意点:

        ①String被final修饰,不可被继承,是不可变的字符序列

        ②String在jdk8及以前内部定义了final char value[]用于存储字符串数据。JDK9时改为byte[]

        ③字符串常量池是不会存储相同内容的字符串的

        ④jdk7前在永久代的运行时常量池中,jdk7及之后在堆中

字符串的拼接:

1、常量与常量的拼接结果在常量池,原理是编译期优化

         “a” + “b” + “c” 优化成了 “abc”

2、拼接前后,只要其中有一个是变量,结果就在堆中

        调用 intern() 方法,则主动将字符串对象存入字符串常量池中,并将其地址返回

        intern() 方法:是一个本地方法,在调用intern方法时,如果池中已经包含了由equals(object)方法确定的与该字符串内容相等的字符串,则返回池中的字符串地址。否则,该字符串对象将被添加到池中,并返回对该字符串对象的地址。

---》示例: String s3 = new String("1") + new String("2");

                堆上:new String("1")、new String("2")、 new String("12")

                字符串常量池:"1"、"2"

         StringBuilder的toString():toString()的调用,在字符串常量池中,没有生成"12"        


        jdk6中:在字符串常量池(此时在永久代)中创建一个字符串"ab"
        jdk8中:字符串常量池(此时在堆中)中没有创建字符串"ab",而是创建一个引用,指向new String("ab"),将此引用返回

垃圾回收:去重操作(垃圾回收章节重点讲解)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值