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<String>) {
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:
网友评论