对于对象来说,他的值改变了但是他在内存中的存储地址没有变。但是对于如下
String s1 = "aa";
String s2 = "aa";
即使值相等,而s1==s1还是不成立的。你上面那句话中的值似乎应理解为存储地址和空间

解决方案 »

  1.   

    // immutable
             String ss1 = new String("a");
             String ss2 = ss1;
             ss1 = ss1.concat("b");
             System.out.println(ss1.toString()+"------>"+ss2.toString()); // oops         // mutable
             StringBuffer sb1 = new StringBuffer("a");
             StringBuffer sb2 = sb1;
             sb1.append("b");
             System.out.println(sb1.toString()+"------>"+sb2.toString()); // same
      

  2.   

    当一String对象的值被改变时,就会在新的地址生成了一个新的对象.从这个意义上来说,原来的对象是不可改变的.而StringBuffer对象是可改变的,改变后的对象还是存在同一地址.
      

  3.   

    helpall() :
       十分感谢你的提示!
       请问如何判断此对象非彼对象?
       另外在你给出的例子中:
             String ss1 = new String("a");
             String ss2 = ss1;       ss2是接收到ss1的地址还是内容呢?按我的理解应该是内容,是吗?
      

  4.   

    equal().由于SS2和SS1都是对像,所以当SS2=SS1时,他们俩指的是同一个字符串“a”。所以应该是地址,不是内容。就是SS1和SS2都指向“a”.
      

  5.   

    除了基本数据型外,所有的赋值都是赋地址.你把地址都给了ss2,当然内容也是一样的了.判断两个变量是否是一个对象,用==. 如果判断两对象是否相等,用equals.最好理解就是把引用想像成指针,如果有C++的概念,所有问题都一目了然了.(JAVA没有指针,但处处是指针)
      

  6.   

    请问有没有确实的方法来判断此时 的ss1已经不是刚才的ss1了呢?谢谢!
      

  7.   

    就用equals已经能判断ss1是否属于同一个对象,也就是判断是否地址相同~~~
      

  8.   

    if(ss2 == ss1) // no change
    if(ss2 != ss1) // changed
      

  9.   

    我想这句话的意思是
    对String类型对象的改变
    事实上是新分配一个对象所以有你所引用的那段话中的说法至于如何判断你只要看 改变前后 两个引用的值(注意:不是内容)是否相同比较方法:使用操作符 "==" 判断
    不能使用s1.equals( s2 ); 去判断
    因为equals()方法判断的是“内容”而不是“地址”