StringTable

String的基本特性:

String声明为final,不可继承,不可变;
String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
String在jdk8及以前内部定义了final char[] value用于存储字符串数据,jdk9时改为byte[]
字符串常量池时不会存储相同内容的字符串的;
使用-XX:StringTableSize可设置StringTable的长度;
jdk8及以后1009是可设置的最小值,默认60013,太小会影响性能;避免hash冲突;Hashtable

String的内存分配:常量池(堆区 元空间)

调整原因:1.permSize默认比较小2.永久代垃圾回收频率比较低;

String的基本操作:
String的拼接操作:

1.常量与常量池的拼接结果在常量池,原理是编译期优化;
2.常量池中不会存在相同内容的常量
3.只要其中一个是变量,结果就在堆中,变量拼接的原理是StringBuilder
4.如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回对象地址。

intern()的使用:

如果字符串常量池中没有对应的data的字符串的话,则在常量池生成;有则直接返回;
//验证String 存放在堆区
//jdk6中:
//-XX:PermSize=6m -XX:MaxMetaspaceSize=6m -Xms6m -Xmx6m
//jdk8中
//-XX:Metaspace=6m -XX:MaxMetaspaceSize=6m -Xms6m -Xmx6m
public class StringTest{
   public static void main(String[] args){
      //使用set保持着常量池引用,避免full gc 回收常量池行为
      Set<String> set = new HashSet<String>();
     //在short可以取值的范围内足以让6MB的permSize或heap产生OOM了
     short i = 0;
     while(true){
     set.add(String.valueOf(i++)).intern();//oom 
     }  
 } 
}

面试题

new String("ab")会创建几个对象?2个看字节码
new关键字对空间创建, 一个 ab在常量池对象
new String("a") + new String("b")呢?
1new StringBuilder
2.new String("a")
3。常量池“a”
4.new String("b")
5.常量池“b”
深入剖析:StringBuilder的toString:
6.new String("ab")
字符串常量池中不存在“ab”

StringTable的垃圾回收

G1中的String的去重操作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值