2007年5月14日星期一

(Java) 理解String对象不能改变

一直不理解String对象的值不能改变是什么意思,
String a = "A";
a += "B";
这时s等于"AB",a不是已经改变了吗?
后来才明白,上面的String对象a,改变的不仅仅是a的值,a所引用的String对象也已经改变了。a最初引用的是String实例"A",后来引用的是String实例"AB"。
 
public class Str {
    public static void main(String[] args){
        String a = "A";
        String ai = a;
        a.concat("B"); // I
        a += "C"; // II
        System.out.println(a);
        System.out.println(a == ai);
        System.out.println(a.equals(ai));

        StringBuffer sb = new StringBuffer("SB");
        StringBuffer sbi = sb;
        sb.append("APPEND");
        System.out.println(sb);
        System.out.println(sb == sbi);
        System.out.println(sb.equals(sbi));
    }
}

仅注释掉行 II,结果如下:
A
true
true
SBAPPEND
true
true
此时对象a的值仍为"A",a对对象的引用也没有改变。
 

仅注释掉行 I,结果如下:
AC
false
false
SBAPPEND
true
true
此时对象a的值已经改变,但是a对对象的引用也已经改变。


总结:String对象实例"A"的值是不可改变的,但是变量a对对象的引用可以改变。

没有评论:

发表评论