本帖最后由 简★零度 于 2013-11-13 15:15 编辑
public class StringTest
{
public static void main(String[] args) {
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
System.out.println(s2.equals(s3));
System.out.println(s2 == s3);
}
}
---------- 运行java程序 ----------
false
true
true
false
输出完成 (耗时 0 秒) - 正常终止
我清楚的知道,s2 s3 的字符串字面值都是"ab",通过 == 其实想比较的是它们是否指向同一对象。
s2.equals(s3)---->比较字符串内容,返回true 没问题
s2 == s3 ---->比较它们是否为同一对象,返回false。
在这个里,+ += 这两个操作符被String唯一重载了。(java是不允许程序员重载操作符的)
s3= "a" + "b"; 这一句实际是调用StringBuilder的append方法将两个字符串连接的。s3最后和 "ab" == 比较表明指向同一对象
s2= s1 + "b"; 这一句完成后 s2 字符串内容也是"ab",同样是用StringBuilder连接。 s2 最后 和 "ab" == 比较表明不是同一对象
我的疑问就是:在使用 + 操作符操作字符串时,是否参与的只有字符串常量时才不会新建空间产生对象(对应s3这种情况)
s2 = s1 + "b" 中有引用变量 s1,这是否是导致 s2 == s3 --->false 的原因了??
希望大家能帮下忙
String s1 = "abc"; ---> 内存中一个对象
String s2 = new String("abc"); --->内存中两个对象
为什么?
|