Java字符串常量池的实现问题

版权声明:转载请注明出处,谢谢! https://blog.csdn.net/qq_34872748/article/details/86132854
public class RuntimeDemo {
	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);
		
	}
}

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

猜你喜欢

转载自blog.csdn.net/qq_34872748/article/details/86132854
今日推荐