JVM-036-StringTable-intern的使用以及StringTable的垃圾回收
intern()的使用
介绍
翻译:
字符串常量池池最初是空的,由String类私有地维护。在调用intern方法时,如果池中已经包含了由equals(object)方法确定的与该字符串内容相等的字符串,则返回池中的字符串地址。否则,该字符串 对象将被添加到池中,并返回对该字符串对象的地址。
JVM-036-StringTable-intern的使用以及StringTable的垃圾回收
翻译:
字符串常量池池最初是空的,由String类私有地维护。在调用intern方法时,如果池中已经包含了由equals(object)方法确定的与该字符串内容相等的字符串,则返回池中的字符串地址。否则,该字符串 对象将被添加到池中,并返回对该字符串对象的地址。
JVM-034-StringTable-String的概述和基本操作
String在jdk8及以前内部定义了final char value[]用于存储字符串数据。JDK9时改为final byte[] value
官方文档:http://openjdk.java.net/jeps/254
原因:
String类的当前实现将字符存储在char数组中,每个字符使用两个字节(16位)。
从许多不同的应用程序收集的数据表明,字符串是堆使用的主要组成部分,而且大多数字符串对象只包含拉丁字符(Latin-1)。这些字符只需要一个字节的存储空间,因此这些字符串对象的内部char数组中有一半的空间将不会使用,产生了大量浪费。
之前 String 类使用 UTF-16编码 的 char[] 数组存储,现在改为 byte[] 数组 外加一个编码标识存储。该编码表示如果你的字符集编码是ISO-8859-1或者Latin-1,那么只需要一个字节存。如果你是其它字符集编码,比如UTF-8,你仍然用两个字节存
结论:String再也不用char[] 来存储了,改成了byte [] 加上编码标记,节约了一些空间
同时基于String的数据结构,例如StringBuffer和StringBuilder也同样做了修改
1 | // 之前 |