JVM 12 StringTable

String的特征

String的基本特征
  • String声明为final的,不可继承的
  • 实现了Serializable接口:
    • 表示字符串是支持序列化
    • 实现了COmparable接口,是可以比较大小的
  • 在JKD8以前内部定义了final char[] value 用于存储字符串数据
  • jdk9时改成了byte[]+标识,如果是字符串,则仍然使用char作为底层,如果是字母类型,则用byte类型,字母类型使用byte能够比原来节省1半的空间
1. String具有不可变性
  • 当字符串重新赋值时,就需要重写指定内存区域的赋值,不能使用原有的value进行赋值

  • 当对现在字符串进行操作做时,也需要重新制定内存空间进行复制,不能再原来的value上进行赋值

  • 当调用replace()方修改指定的字符串时,也需要重新指定内存区域进行赋值,不能使用原有的value进行赋值

    通过字面量的方式(区别于new) 给一个字符串进行字符串赋值,此时的字符串声明是在字符串常量池中。
字符串常量池中不会存储存储相同内容的字符串
  • String 的String pool 是一个固定大小的的hashtable,默认值大小长度为1009,如果放进String pool 的String非常多,就会造成hash冲突,从而导致链表会非常长,而链表长了之后直接影响了调用String.intern时的性能
  • 使用-XX:StringTableSize来设置StringTable的长度
  • 在JDK6中,StringTable是固定的,固定为1009,如果常量池中的字符很多就会导致效率下降很快,StringTableSize设置没有要求
  • 在JDK7中,StringTable的默认长度为60013,设置长度没有要求
  • JDK8中,1009是可设置的最小值
字符串的拼接
  1. 常量与常量的拼接结果是放在常量池中的,原理是编译期的优化
  2. 常量池中不会存在内容相同的常量
  3. 只要其中有一个是变量,结果就是在堆中,变量拼接的原理是StringBuilder
  4. 如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入到常量池中,并返回此对象地址
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值