String.intern()原理及详解说明
下文笔者讲述String.intern()原理及详解,如下所示
String.intern()简介
String.intern()是JDK一早就提供的native方法 是底层JVM实现
String.intern()的功能
String.intern()的功能: 将String池化 将String放入到常量池中
String.intern()之JDK的实现方式
JDK 6 intern()方法会把首先遇到的字符串复制一份到永久代中 然后返回永久中的实例引用 如果不是首次,说明常量池中已经有该字符串 直接返回池中的引用 常量池在永久代(PermGen)中。 JDK 7 intern()方法首次遇到字符串时,不会复制实例 而是直接把该字符串的引用记录在常量池中 并返回该引用 如果不是首次,则直接返回池中引用,JDK 7常量池在堆中。 JDK 8:功能与JDK 7类似 常量池在元空间Metaspace中 元空间不在虚拟机内存中 而是使用本地内存。
常量池大小差异
JDK 6早期版本: 池大小为常量1009,后期变得可配置 使用参数-XX:StringTableSize=N指定 大小也会受限于永久代的大小,建议避免使用intern()方法,防止造成PermGen内存溢出。 JDK 7: 将常量池移到堆后,可以存放更多常量 也一样通过参数可配置大小 在Java 7u40版本之后,常量池默认大小增加到60013 JDK 8: 默认大小一开始就是60013 依旧支持参数配置例
jdk8
String str1 = new String("java265.com"); System.out.println(str1.intern() == str1); ----运行以上代码,将输出以下信息---- false例
String str1 ="java265.com"; System.out.println(str1.intern() == str1); ----运行以上代码,将输出以下信息---- true
String str1 = new StringBuilder("java265").append("com").toString(); System.out.println(str1.intern() == str1); String str2 = new StringBuilder("java265").append("com").toString(); System.out.println(str2.intern() == str2); ----运行以上代码,将输出以下信息---- true false 代码说明 第一句创建了一个新的字符串对象,str1为其引用 调用str1.intern()时会把它的引用放到常量池中并返回 所以是同一个引用。 在(1)中已经放在常量池 所以str2.intern()返回的是str1与str2不相等
String str = new StringBuilder("java265").append("com").toString(); System.out.println(str.intern() == str); ----运行以上代码,将输出以下信息---- false 可能以前字符串已经存在于 常量池中,所以这种比较字符串的方法非常恐怖(有Bug)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。