黑马程序员技术交流社区

标题: String问题 请看图 [打印本页]

作者: yooc    时间: 2013-6-5 17:34
标题: String问题 请看图
本帖最后由 yooc 于 2013-6-6 17:31 编辑




毕老师说字符串一旦建立不可更改,那么图中红框位置怎么理解?是否建立了多个对象?如果是,则建立了几个对象?谢谢


作者: 风乐    时间: 2013-6-5 18:41
本帖最后由 风乐 于 2013-6-5 18:51 编辑

str这个引用指向的地址变了,开始是指向你传参传入的字符串地址,然后红框中生成了原字符串的子串,等于新建了一个对象,又把这个新子串的地址赋给了str引用。

未命名.jpg (40.85 KB, 下载次数: 0)

未命名.jpg

作者: yooc    时间: 2013-6-5 21:13
风乐 发表于 2013-6-5 18:41
str这个引用指向的地址变了,开始是指向你传参传入的字符串地址,然后红框中生成了原字符串的子串,等于新 ...

那么原有的字符串被当作垃圾处理了吗
作者: 王瀛    时间: 2013-6-5 21:36
这里是取了str的子串之后,将子串的内存地址赋给了str

也就是说是str这个引用指向的对象发生了改变,并不是对象自身改变
作者: 王瀛    时间: 2013-6-5 21:37
yooc 发表于 2013-6-5 21:13
那么原有的字符串被当作垃圾处理了吗

原先的对象由于没有新的指向,应该是等待 垃圾回收机制回收的
作者: yooc    时间: 2013-6-5 21:57
王瀛 发表于 2013-6-5 21:37
原先的对象由于没有新的指向,应该是等待 垃圾回收机制回收的

谢谢                              
作者: 武志红    时间: 2013-6-6 09:57
首先,他是创建了多个对象,他会在原来的基础上截取一段出来形成一个新的String对象,至于创建了多少个对象,你是想知道str指向了多少个新的对象吗?这和你给的最初的字符串str以及key有关。如果你想知道运行这段代码的时候系统中创建了多少个对象,那就太多了,创建新的string的时候,string里面还包括了其他的对象,你也得去创建。其实你如果是认真去理解源代码,这个问题不难理解,string的substring(int)方法最终指向的方法:
public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > count) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        if (beginIndex > endIndex) {
            throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
        }
        return ((beginIndex == 0) && (endIndex == count)) ? this :
            new String(offset + beginIndex, endIndex - beginIndex, value);
    }
这个方法在string类中,可以自己试着理解一下




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