A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cena约翰塞纳 中级黑马   /  2013-9-29 23:34  /  2349 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
字符串对象是"a", "aa",a只是一个引用,指向字符串对象地址值,String a="a";a指向字符串对象"a",a="aa";
a又重新指向 "aa",其实是a的地址值在变,字符串对象始终没变;

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
String a = "a";中的a是代表字符‘a‘的地址值的引用,它代表字符串。
而 a="aa";中的a是作为一个常量来使用了。
此a非彼a,并不能够认为字符串被改变了。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
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 、、、、、、、、、、、、、、、、、、、、、、

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
变量和中的a,aa只是引用,String本身没有变化,只是把指向改变了,把指向a的指向aa而已。
回复 使用道具 举报
你参考一下这个,然后应该就 明白了

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

StringBuffer和String.png

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马