Java中String的intern

Java中String的intern

Posted by CaiJiahe on June 9, 2017

0x01 复现问题

public class TestStrIntern {
	
	@Test
	public void test1() {
		String str1 = new String("1") + new String("11");
		str1.intern();
		String str2 = "111";
		Assert.assertTrue(str1 == str2);
	}
	
}

在JDK1.6和1.7上分别运行该段代码,发现在JDK1.6上输出false,在JDK1.7上输出true。

0x02 原因

String.intern:判断字符串常量池中是否存在该串,不存在则加入到字符串常量池中。
JDK1.6中字符串常量池存储在永久代中,永久代是与java堆不同的内存区域。而JDK1.7中字符串常量池从永久代移到了java堆当中存储。