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)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


