题目一
final String str="hello";
final String str1="he"+ new String("llo");
final String str2 ="he" + "llo";
System.out.println(str==str1);//flase
System.out.println(str==str2);//true
System.out.println(str1==str2);//flase
final String str3= new String("llo");
final String str4 ="he" + str3;
System.out.println(str==str4);// false
System.out.println(str1==str4);//false
System.out.println(str2==str4);//false
题目二
String s1=new String("Test");
String s2=new String("Test");
if (s1==s2) System.out.println("Same");//s1==s2 false
if (s1.equals(s2)) System.out.println("Equals");//Equals
String s3="Test";
String s4="Test";
if (s3==s4) System.out.println("3Same4");//3Same4
if (s3.equals(s4)) System.out.println("3Equals4");//3Equals4
if (s1==s3) System.out.println("1Same3");//s1==s3 false
s1.intern();
System.out.println(s1==s3);//false
System.out.println(s1.intern()==s3);//true
s1=s1.intern();
System.out.println(s1==s3);//true
总结:
一 :new String("");肯定是创建一个新对象,与常量池中肯定不是同一对象。与其他new出来的对象也不是同一对象。但equals都是相等的,因为他们的hashcode是一样的。
二 : intern()方法 如果常量池没有将字符串放入常量池并返回常量池地址的引用。
代码中红色的部分s1.intern(); 执行后 s1==s3是false 因为s1 指向的还是new出来的对象。并没有发生改变。
代码中蓝色的部分s1=s1.intern();执行后 s1==s3是true 因为s1 指向的s1.intern()返回常量池地址的引用。都指向常量池中的对象
三: 代码中紫色的部分声明只要+的一侧是new 出来的,则认为是新对象。