String的常量池一般称为StringConstant Pool(实质是一个数组),StringConstant Pool作为运行时数据存放在permanent区(方法区),jdk1.7之后放在堆空间中。
String str="123"; str这个引用存放在栈中,123这个字符串存放在常量池。
String st=new String("123");会生成3个对象:st这个引用存放在栈中,堆中的123,常量池的123。
intern()方法:当调用 intern 方法时,如果常量池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
jdk1.6之前,常量池中存放的是具体的字符串,执行string.intern()这个本地方法,jdk1.6进行equals判断,常量池没有则复制此字符串加入常量池并返回指向此常量池字符串的引用;jdk1.7之后,常量池中存放的是字符串的引用,执行string.intern()方法,jdk1.7进行equals判断,常量池没有则将此字符串的引用放入常量池并返回。