不是说String是不可修改的吗,得用StringBuffer,但是我编了个程序试验
String a = "a";
a = a + "b";
System.out.println(a);结果输出:ab
请问这是怎么回事呢?

解决方案 »

  1.   

    那这样java定义的String不可更改就没有任何意义了啊?
      

  2.   

    a--->“a”在内存的一个地方,"a"就不能更改了
    “ab”在内存的另一个地方
      

  3.   

    public class TestString {
    public static void main(String[] args) {
    String a = "a";
    String b = "a";
    System.out.println(a == b);
    a = a + "b";
    System.out.println(a == b);
    }
    }
    /*
     * 首先在用== 号比较时,是比较的两个对象的地址,而不是内容。
     * 上面的程序的输出结果为true 与    false。说明了什么 。在创建 b 这个对象的时候,
     * 是先查找是否已存在"a"这个对象(也就是a),已有了,所以,第一个输出 true;而第
     * 二个输出false 说明,些时的a对象之前的a 不是同一个对象。说明在进行a = a + "b";
     * 这句时,a就指向了重新创建的一个对象"ab",所以输出false;
     *     不知道这样理解有误不,有误请指教。
     */
      

  4.   

    楼主应该是没有看String常量池的内容吧,String类是不可修改,但是a = a+"b";就新建了一个字符串“ab”,并把它赋给a,a引用了新的对象“ab”,原来的“a”被放入内存常量池中,如果
    String a = "a";
    String b = a + "b";
    System.out.println(a);
    结果输出为“a”,a并没有改变。新建了Sting对象“ab”并赋给b
    建议楼主仔细看看,多举例子,很容易就明白了
      

  5.   

    public class Test { /**
     * 测试String对象
     * @param args
     */
    public static void main(String[] args) {
    String s="abc";//创建“abc"对象并放入对象池中。
    s=s+"123";//在对象"abc"后面追加"123",并没有创建新对象。
    s=s.substring(2,5);//创建新对象s.
    s=s.toLowerCase();//创建新对象s.

    String s1="abc"+"123";//此语句一共创建了三个对象:"abc"、"123"、s1

    String s2=new String("abc");//此语句一共创建了二个对象:对象池中的"abc"、椎中的s2 }}