KOTLIN中的String.intern()与JAVA中的String.intern()区别


layout: post

title: KOTLIN中的String.intern()与JAVA中的String.intern()区别

categories: KOTLIN

description: KOTLIN中的String.intern()与JAVA中的String.intern()区别

keywords: KOTLIN

KOTLIN代码

package num2

/**
 * Created by Joey_Tsai on 2018/3/6.
 */
public class RuntimeConstantPoolOOM2_7{

}

fun main(args: Array) {
    val str1 : String = StringBuilder("计算机").append("软件").toString()
    println(str1.intern() == str1)

    val str2 : String = StringBuilder("ja").append("va").toString()
    println(str2.intern() == str2)
}

运行结果


KOTLIN中的intern()

JAVA代码


/**
 * Created by Joey_Tsai on 2018/3/7.
 */
public class Test1 {
    public static void main(String[] args) {
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern()==str1);

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern() == str2);
    }
}

运行结果


JAVA中的intern

相关资料

在JDK1.6中,intern()会把首次遇到的字符串实例复制在永久代中,返回的
也是永久代中这个字符串实例的引用,而StringBuilder创建的字符串实例
在java堆上,所以必然不是同一个引用,将返回false。而JDK1.7中的
intern()实现不会再复制实例,只是在常量池中记录首次出现的引用,因此
intern()返回的引用和由StringBuilder创建的那个字符串实例是同一个。对
于str2返回false是因为'java'这个字符串在执行StringBuilder.toString()之前
已经出现过,字符串常量池已经有它的引用,不符合首次出现原则,而'计
算机软件'这个字符串则是首次出现返回true。  

关于
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2);
个人认为"java"一开始就存在常量池中

原因

 TODO:

你可能感兴趣的:(KOTLIN中的String.intern()与JAVA中的String.intern()区别)