public class test {
public static void main(String[] args) {
String st = "i love u";
st  = st + " more";
System.out.println(st); String st1 = new String("i love u");
st1 = st1 + st; 
System.out.println(st1); st1 = st1.substring(0,7);
System.out.println(st1);
       }
}
看上面的程序string对象都已经被改变了,突然脑袋转不过弯来,那么string的immutable又体现在什么地方呢?

解决方案 »

  1.   

    你把st1 = st1 + st; 以及st1 = st1.substring(0,7);换成,st1 + st;及st1.substring(0,7);就有感觉了。
      

  2.   

    实际上很不明显,但是String等基本对象确实是不可被修改的,只可意会吧~~
    就比如例子操作后返回的值并不是原来的对象,而是新产生的一个String对象。
      

  3.   

    我猜LZ一定没学过c语言中的指针
      

  4.   

    i love u more
    i love ui love u more
    i love 
      

  5.   

    我把LZ的代码加了点东西,LZ再看下:
    String st = "i love u";
    System.out.println(st.hashCode());
    st  = st + " more";
    System.out.println(st.hashCode());
    System.out.println(st);
    String st1 = new String("i love u");
    System.out.println(st1.hashCode());
    st1 = st1 + st; 
    System.out.println(st1.hashCode());
    System.out.println(st1);
    st1 = st1.substring(0,7);
    System.out.println(st1.hashCode());
    System.out.println(st1);
    而对于st1.substring(0,7);这句,如果LZ不是把st1.substring(0,7);的结果再赋给st1的话,st1的hashCode与内容都不会变,每对String类型赋一次值,hashCode都在变化,相当于什么LZ想过没有?
      

  6.   

    使用 final 修饰一下、就可以发现 可变类与不可变类的区别了。
      

  7.   

    看来String理解应该算是JAVA的一个难点
      

  8.   

            String st = "i love u";
            st  = st + " more";
            System.out.println(st);
    其实对于改变的是st变量,不是String对象。简单做个这样的实验
    String st = "i love u";
    String old = st;//让old去应用原有的String对象
    st  = st + " more";
    System.out.println(st);
    System.out.println(old);//如果string对象还是“i love u”,就表明原String对象没有改变