String a="gaojie";
a="liangming";
问:gaojie和liangming是同一内存地址吗?不可变String如何理解?

解决方案 »

  1.   

    不是的 string是一旦定义好了以后就不可以改变 a="liangming"是新开了一块内存空间将a存的地址改变成新开的地址
      

  2.   

    a先指向gaojie  比如gaojie的内存地址为00000001,但当a=liangming时,a指向liangming而liangmin的地址不是00000001 而gaojie的地址仍是00000001
      

  3.   

    1,不是同一内存地址.
    2, String类 是 final 的. 当你对 String的对象进行拼接等操作的时候 都是生成的新的String对象.
    如: String a = "gaojie" ; 然后 你改变 a="liangming" ; 这个时候 的 a 就是一个新的String 对象了.
    原来等与"gaojie"的哪个 a 会被 jvm 回收.
    所以String 不可变.
      

  4.   

    a= lianmiing 这个时候已经重新生成一个地址,里面放着lianming。不过,如果a =beijing ? 会怎样
      

  5.   

    楼主把“不可变”理解错了。String不可变是指它(这个对象本身)一旦创建,就不会被改变。
    String s = "abc";
    s.toUpperCase();
    现在s仍然是小写的"abc",唯一的办法是
    s = s.toUpperCase();
    这是s才改变了,但是改变的原因是s这个对象引用指向了一个新的从方法中返回的大写"ABC";
      

  6.   

    噢,谢谢楼上各位热心帮助,,可否理解为String s是个引用
      

  7.   

    各位可能解释的不够全面阿,String类比较特殊,初始化的时候如果用new String(“xxxxx”)的形式是生成一个新的空间的。
    但是如果用s = "xxxx"的形式初始化,这个时候,"xxxx"被放在常量区域,再去用"xxxx"去初始化另一个String 对象的时候。两个对象的地址相同。
    例如:
    String s1 = new String("aaa");
    String s2 = new String("aaa");
    此时s1与s2指向不同地址,如果改成下面这样String s1 = "aaa";
    String s2 = "aaa";
    此时则s1与s2指向同一个地址
      

  8.   

    呵呵,可以做一下试试
    String s1 = "d";
    String s2 = "d";
    boolean b = (s1==s2)
    String s3 = new String("d");
    String s4 = new String("d");
    boolean b2 = (s3==s4)
    你看看返回什么?java中的"=="就是比较内存地址的,看看有什么区别吧
      

  9.   

    "==": 比较地址
    ”equal“: 比较值10楼提出的不错!
      

  10.   

    不是同一内存地址"==": 比较地址
    ”equal“: 比较值 
      

  11.   

    http://blog.csdn.net/kofsky/archive/2007/11/13/1882626.aspx
      

  12.   

    String是复杂数据类型,不是简单数据类型。
    String a="gaojie"; 等同于String a=new String("gaojie");
    java里简单类型是存放在栈里,对象是放在堆里!栈里只是保存着这个对象的引用
      

  13.   

    两者是不相等的,String a="gaojie";将a引用的字符串对象"gaojie"放在内存的常量区,而String a=new String("gaojie"); 则将对象放在堆中。String s = "a";
    String s1 = "a";
    这时候s与s1引用同一个常量区的"a"对象的地址,所以s==s1返回true
    String s = new String("a");
    String s1 = new String("a");
    这时候会产生2个"a"对象,放在堆中,s与s1分别引用不同地址,固此时s==s1返回false
      

  14.   

    String a="gaojie"; //栈中有个常量a,指向string池里“gaojie"字符串,
    a="liangming"; //栈中的a,指向另一个字符串"liangming"
      

  15.   

    String s 就是一个引用呀
      

  16.   

    有兴趣可以去看看String的源代码
      

  17.   

    gaojie和liangming不是同一内存地址。引用发生了变化
      

  18.   

    String是不可变的,并不是这种意思。我打个比方。String tmp="abcdef"
    然后 tmp.subString(1,2);
    虽然用subString()的方法截取了一部分,但是tmp的值并没有因此而改变。所以说是不变的。
    但是对于StringBuffer来说,他的delete方法删除一个字符就会少一个字符,也就是原字符串会改变。就这个意思
      

  19.   

    2, String类 是 final 的. 当你对 String的对象进行拼接等操作的时候 都是生成的新的String对象. String 类是final只表示它不可继承的一些特性,而没有说明"String的对象进行拼接等操作的时候 都是生成的新的String对象."String的对象进行拼接等操作的时候 都是生成的新的String对象:
    String str = "aa";
    str = str+"uu";
    原来的"aa"对像并不会因为str+"uu"而变成"aauu"
    而是产生一个新的对像"aauu",然后把对像的首地址返回.
    假设"aa"对像的首地址为01
    +"uu"之后并不会在"aa"空间后边加上"uu"然后返回01地址.
    而是生成一个"aauu"对像,然后再把这个对像的首地址返回.
      

  20.   

    比较同意20楼的说法。
    好像是java内部运行原理的问题。