class Teststring{
书中原文说道:"String类型的对象是不可改变的;一旦创建了一个字符串对象,它的内容是不能被改变的."
这句话怎么理解呢?
我下面这个例子在创建字符串变量a后把a的内容改为"aa",也没报错啊!public static void main(String args[]){
String a="a";
String b=a+"b";
System.out.println("a="+a);
System.out.println("b="+b);
a="aa";
System.out.println("a="+a);
}
}//结果
a=a
b=ab
a=aa

解决方案 »

  1.   

    第一次a=a,变量a被指向了对象1
    第二次a=aa 变量a被指向了对象2
    你得赋值操作只是改变了变量引用内存区域的位置,而没有改变那块内存中的数据内容。
    就是说,对象1中的内容还是“a”,但是没有变量去引用它了而已,不久就会被垃圾回收
      

  2.   

    原因在于String对象的成员是final char[]类西的。
      

  3.   

    please refer to the source codefinal class String
    you can only give an intial value to a string object by new String("initial value");after that, you can not change its value any more.in your case,
    you are using String object as a reference, it won't change the internal value at all.
      

  4.   

    因为 String 是 final
      

  5.   

    简单的说 a=a+"b"后的a就已经不是之前的a了
    前后两个a是两个不同的对象了,在内存中也是独立的两块空间了
    a+"b"并不是在原有的a对象中续了一个'b',而是重新new了一个对象
      

  6.   

    简单的说,就是你每赋值一次,系统就会新建一个对象,而原来的对象是还保存在堆中的。直到不再需要的时候再被回收。
    比如
    String a="a";
    String a="b";
    String a="c";
    这时堆内有三个对象,“a","b","c",而变量a指向的是"c".
      

  7.   

    更正一下
    String a="a";
    a="b";
    a="c";
      

  8.   

    简单来说就是
    String a = ...;
    String b = a;无论你怎么操作b(在没有操作a的情况下),你都无法改变a的值
      

  9.   

    这个问题分析内存就知道。
    string a="aa";
    等号的左边 string a 只是在栈区声明的一个变量(相当于一个指针)
    等号右边的负值  把"aa"付给a  就是让栈区的 a 指向堆区的实例 "aa"
    java 的字符串都存在一个叫做"字符串池"中
    string a="aa"; 这句代码 是让a指向"aa" 如果字符串池中已存在"aa"
    那a 将直接指向"aa"如果"aa"不存在 系统将在堆区开内存新创建一个"aa"!
    当再让a="bb"时 
    那a 将直接指向"bb"如果"bb"不存在 系统将在堆区开内存新创建一个"bb"
    而并不是把"aa"改变成"bb"了,"aa"依然是存在的    string a1="aa"; 
            string a2="aa";      a2="bb";
        打印出a1和a2; a1的值会不会也是"bb"?<-_->基础知识多看书啊!!          
      

  10.   

    其实是指String对象数据是不可变的
    比如 String s = new String("123456");
    之后你怎么操作s,在JVM中之前建立的这个“123456”都是不会改变的,除非被GC
      

  11.   

    String a = new String("valuea"); 相当于创建了两个对象
    a在栈中是一个引用
    "valuea" 在堆中是一个String类型的数值对象,是不会改变,一旦没有了引用指向他就变成了垃圾,会被java的垃圾回收器自动处理掉------------------------------------------------------------------------------
    xiaTao0520(飞沙) 同学讲的和我以前学的不太一样
    不知道 正解是什么
    string a="aa"; 这句代码 是让a指向"aa" 如果字符串池中已存在"aa"
    那a 将直接指向"aa"如果"aa"不存在 系统将在堆区开内存新创建一个"aa"!
    这里"aa"应该 还是在池中创建把String a = new String("a");
    会先先判断池中有没有"a"如果 会把“a” 复制到堆中然后a指向"a"两者区别:
    String b = "a";和前者String a = "a";指向同一个"a"
    String b = new String("a"); 是在堆中从新创建了一个"a";
      

  12.   

    不单纯是STRING ,double ,float integer
    都是不可变类