String str = "a";


1个,在常量池中创建了一个字符串对象。


String str = new String("a");


2个,在常量池中创建了一个字符串对象"a",在堆中开辟了一个空间又放了一个"a"。


String str = "a"+"b";


1个,在编译期,jvm将"a"+"b"自动识别成"ab",因此只创建了一个对象,放在常量池中。


String a="a";//创建一个
String b="b";//创建一个
String ab1 = a+b;//创建一个
String ab2= a+b;//创建一个


4个,第三和第四行,各创建了一个对象,因为对于编译器来说,创建ab1和ab2时候,a和b的值被当做是不确定的,所以各自开辟空间创建对象


final String a="a";//创建一个放常量池
final String b="b";//创建一个放常量池
String ab0=a+b;//创建一个放常量池
String ab1=a+"b";//不再创建
String ab2 = "ab";//不再创建


3个,在String前边加个final,后边再用这个对象的时候,对编译器来说a的值是确定的,和"a"是一个东西都是“字面常量字符串”。




//此时str1与str2相当于变量,而不是常,因为块是在运行时才能确定,在编译时不能确定  
final static String str1;
final static String str2;
static {
str1 ="aaa";
str2 ="bbb";
}
public static void main(String[] args){
String str3 = str1 + str2;
String str4 ="aaabbb";
System.out.println(str3==str4); //输出为false
}
String str=" ";与String str=new String();
str=" "会放入池中,但new String()不会放入池中。



String的intern()方法​ 

“当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串;否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。​它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true”,这是jdk文档原文注解。