1.首先是== 与equals
== 说明两个引用相同,即存储的地址相同;equals说明两个对象值相同。
2.分析的代码:
public static void main(String args[]){
String s1 = new String("abc");
String s2 = "abc";
String s3 = "a"+"bc";
String s4 = new String("a")+"bc";
String s5 = new String("ab")+"c";
String s0 = "a";
String s10 = "bc";
String s6 = s0+"bc";
String s7 = s0+s10;
System.out.println (s1==s2);
System.out.println (s2==s3);
System.out.println (s2==s4);
System.out.println (s2==s5);
System.out.println (s4==s5);
System.out.println (s2==s6);
System.out.println (s2==s7);
System.out.println (s6==s7);
}
执行结果:
s1 :在堆区创建一个字符串,字符串的值储存在常量区,相当于执行了“abc”和String()两个语句,创建两个对象;
s2 :在常量区创建字符串(当然如果常量区有就不用创建了);
s3:创建三个对象,先“a”后“bc”最后“abc”(“abc”是复制的a和bc);
s4和s5:他们创建的最后字符串值不加入常量区;只有使用引号包含的文本当方式创建的String之间使用+号连接产生的新对象才会加入常量区,例如s3.
具体的分析图如下: