黑马程序员技术交流社区

标题: 关于String类型创建对象的问题! [打印本页]

作者: cena约翰塞纳    时间: 2013-9-29 23:34
标题: 关于String类型创建对象的问题!
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
作者: lizhangzhi    时间: 2013-9-29 23:54
字符串对象是"a", "aa",a只是一个引用,指向字符串对象地址值,String a="a";a指向字符串对象"a",a="aa";
a又重新指向 "aa",其实是a的地址值在变,字符串对象始终没变;
作者: .只影、天涯.    时间: 2013-9-30 03:44
String a = "a";中的a是代表字符‘a‘的地址值的引用,它代表字符串。
而 a="aa";中的a是作为一个常量来使用了。
此a非彼a,并不能够认为字符串被改变了。
作者: yting_xmei1129    时间: 2013-9-30 10:27
String类提供了数值不可改变的字符串

这个是指String内部元素的定义。看一下源码。
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** The count is the number of characters in the String. */
    private final int count;

这些都是final
这些在初始化以后,就不可以再改变了。

那么String.concat  方法又是怎么实现的呢?
public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        char buf[] = new char[count + otherLen];
        getChars(0, count, buf, 0);
        str.getChars(0, otherLen, buf, count);
        return new String(0, count + otherLen, buf);
    }

它又生成了一个新的字符串。

作为一个已经定义好的字符串,它本身已经不能再发生变化了。

String指向的引用是不可改变的
这个我不太肯定,我想它说的还是String类是使用final定义的。

String strt = "1234";
System.out.println(strt.hashCode());
strt = "abcd";
strt = "1234";
System.out.println(strt.hashCode());
这两个hashCode是相等的。
一个字符串在JVM中的引用是固定的。

而变量的引用是可变的。

希望可以帮到楼主、、、

The you smile until forever 、、、、、、、、、、、、、、、、、、、、、、
作者: doevents    时间: 2013-9-30 10:32
变量和中的a,aa只是引用,String本身没有变化,只是把指向改变了,把指向a的指向aa而已。
作者: 杨增坤    时间: 2013-9-30 11:06
你参考一下这个,然后应该就 明白了

StringBuffer和String.png (33.4 KB, 下载次数: 47)

StringBuffer和String.png

作者: 陈钦涛    时间: 2013-10-2 00:12
String a="a"时候,栈内存开辟空间给a,在字符串常量池查找有木有字符串类型的"a",没有的话就创建一个,并把"a"的地址存放到a变量中。b=a+"b"时,同样在字符串常量池中建立"b",栈内存中b存有指向它们的地址值。a="aa"时,常量池又创建了"aa",并且将原先栈内存a变量中的地址值变更成了"aa"在常量池的地址值。"aa"我们看起来就像在"a"后面添加了再加一个一样,在计算机看来却是不一样的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2