String str1 = "hello"; String str2 = "he" + new String("llo"); System.err.println(str1 == str2);
String str1 = "hello";这里的str1指的是方法区的字符串常量池中的“hello”,编译时期就知道的; String str2 = "he" + new String("llo");这里的str2必须在运行时才知道str2是什么,所以它是指向的是堆里定义的字符串“hello”,所以这两个引用是不一样的。
如果用str1.equal(str2),那么返回的是True;因为两个字符串的内容一样。
public static void main(String[] args)
{
//s1直接引用常量池中的"hello",如果常量池中还没有,就再常量池中创建
String s1="hello";
String s2="he";
String s3="llo";
//s4后面的字符串值在编译时就可以确认下来
//s4直接引用常量池中的"hello"
String s4="he"+"llo";
//s5后面的字符串值在编译时不可以确认下来
//不能引用常量池中的字符串
String s5=s2+s3;
String s6= "he" + new String("llo");
System.out.println(s1==s4);//输出true
System.out.println(s1==s5);//输出false
System.out.println(s1==new String"hello");//输出false,new string是在运行时创建出来,被保存在堆中,不放在常量池中
System.err.println(s1 == s6);//false,同s5
}