String.intern()原理及详解说明

书欣 Java教程 发布时间:2023-03-10 22:50:06 阅读数:185 1
下文笔者讲述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)
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202303/6000.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者