StringTable(运行时常量池中的串池,底层时hash表)
- 常量池中的信息,都会被加载到运行时常量池中
- 串池中的对象不是一开始就会创建,而是代码运行到创建对象的行数才会在串池中创建(懒惰加载)
- 两个字符串变量拼接:底层都会转换成StringBuilder的append方法
- 两个字符串常量拼接:javac在编译期间的优化,结果已经在编译期确定,因此会在串池中搜索是否包含结果,如果存在串池中不会生成新的元素
- 常量池中的字符串仅是符号,第一次使用时才变为对象
- 利用串池机制,来避免重复创建字符串对象
- 可以使用intern方法,主动将串池中还没有的字符串对象放入串池中(1.6会将对象拷贝一份放入串池,1.8不会拷贝直接放入),如果没有放入串池,会把串池中的对象返回
- 无用的字符串常量,在占用过大时,也会被回收机制回收
- StringTable调优:
- 扩大StringTable的Size(-XX:StringTableSize=桶个数),因为底层时hash表,可以牺牲空间换效率
- 考虑字符串对象是否入池(hash,如果有大量重复字符串,可以考虑入池来节省空间)