public class Test {
public static void main(String args[]) {
String a = "abc";// a 的地址指向"abc"
String b = "ab";// b的地址指向"ab"
String c = b + "c";// c的地址指向一个新的"abc"
System.out.println(a == c);// 输出a 的地址与 c的地址相比较的结果
System.out.println(a.equals(c));
a = "ab";// a 的地址指向"ab"
b = "a" + "b";// b的地址??
System.out.println(a == b);
}
}
此程序的结果是这样的
false
true
true最后a 与 b相比较的结果是true,也就是说在b = "a" + "b"之后b与a指向的地址相同,这是为什么??b = "a" + "b"不会为b重新分配一个地址吗??
谁能具体说一下String在内存中是如何储存的?

解决方案 »

  1.   

    public class Test {
    public static void main(String args[]) {
    String a = "abc";// a 的地址指向"abc"
    String b = "ab";// b的地址指向"ab"
    String c = b + "c";// c的地址指向一个新的"abc"
    System.out.println(a == c);// 输出a 的地址与 c的地址相比较的结果
    System.out.println(a.equals(c));
    a = "ab";// a 的地址指向"ab"
    b = "a" + "b";// b的地址??
    System.out.println(a == b);
    }
    }
      

  2.   

    public class Test {
    public static void main(String args[]) {
    String a = "abc";// a 的地址指向"abc"
    String b = "ab";// b的地址指向"ab"
    String c = b + "c";// c的地址指向一个新的"abc"
    System.out.println(a == c);// 输出a 的地址与 c的地址相比较的结果
    System.out.println(a.equals(c));
    a = "ab";// a 的地址指向"ab"
    b = "a" + "b";// b的地址??
    System.out.println(a == b);
    }
    }
      

  3.   

    我贴段反编译过后的代码,楼主应该有所体会
    import java.io.PrintStream;public class Test
    { public Test()
    {
    } public static void main(String args[])
    {
    String a = "abc";
    String b = "ab";
    String c = (new StringBuilder(String.valueOf(b))).append("c").toString();
    System.out.println(a == c);
    System.out.println(a.equals(c));
    a = "ab";
    b = "ab";//此处,a 与 b 是完全相同的内容,JVM自动优化的代码格式.
    System.out.println(a == b);
    }
    }String这个类有点特殊,有时可以将它近似地看作基本类型,有时又必须将两者区分开.
    当String a = "stringOfContent"时,这种形式可以近似地看作基本类型,时行“==”比较时,只比较String的内容是否相同.String a = "stringOfContent";
    String b = "stringOfContent";
    Sysout(a == b);//结果为true,只比较内容,不比较地址,可以理解为JVM自动优化a,b使它们同时指向了"stringOfContent"这段存储空间,也就相当地址一样了.当String b = new String("stringOfContent");时,必须以构造新类的思想来看待.
    String a = new String("stringOfContent");
    String b = new String("stringOfContent");Sysout(a == b);//输出为false,因为Jvm已通过构造函数为a,b分配了不同的存储空间.