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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yooc 中级黑马   /  2013-6-5 17:34  /  1361 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yooc 于 2013-6-6 17:31 编辑




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

评分

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

查看全部评分

7 个回复

倒序浏览
本帖最后由 风乐 于 2013-6-5 18:51 编辑

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

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

未命名.jpg

评分

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

查看全部评分

回复 使用道具 举报
风乐 发表于 2013-6-5 18:41
str这个引用指向的地址变了,开始是指向你传参传入的字符串地址,然后红框中生成了原字符串的子串,等于新 ...

那么原有的字符串被当作垃圾处理了吗
回复 使用道具 举报
这里是取了str的子串之后,将子串的内存地址赋给了str

也就是说是str这个引用指向的对象发生了改变,并不是对象自身改变
回复 使用道具 举报
yooc 发表于 2013-6-5 21:13
那么原有的字符串被当作垃圾处理了吗

原先的对象由于没有新的指向,应该是等待 垃圾回收机制回收的
回复 使用道具 举报
王瀛 发表于 2013-6-5 21:37
原先的对象由于没有新的指向,应该是等待 垃圾回收机制回收的

谢谢                              
回复 使用道具 举报
首先,他是创建了多个对象,他会在原来的基础上截取一段出来形成一个新的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类中,可以自己试着理解一下

点评

醍醐灌顶!感谢  发表于 2013-6-6 17:29

评分

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

查看全部评分

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