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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Himoriarty 中级黑马   /  2015-4-16 23:10  /  3726 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Welcome");

//就是这不太懂而且说是stringBuilder和stringBuilder1指向同一个StringBuilder对象。为什么?
StringBuilder stringBuilder1 = stringBuilder.reverse();

而且单独打印stringBuilder或者stringBuilder都可以打印出结果,这两个不是对象名嘛,为什么还可以直接打印。
StringBuilder类中是什么样的情况。

最佳答案

查看完整内容

这图片弄的我纠结死……都搞不懂为啥一直上传都是不清晰。 看得懂这图的话就给我分咯

9 个回复

正序浏览
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Welcome");

//就是这不太懂而且说是stringBuilder和stringBuilder1指向同一个StringBuilder对象。为什么?
StringBuilder stringBuilder1 = stringBuilder.reverse();
StringBuilder stringBuilder1 = stringBuilder.reverse();    //这句我给你看看StringBuilder的源码
reverse()的源码如下
public StringBuilder reverse() {
        super.reverse();      //他是先调用自己父类的reverse()方法
        return this;
    }

public AbstractStringBuilder reverse() {
        boolean hasSurrogate = false;
        int n = count - 1;
        for (int j = (n-1) >> 1; j >= 0; --j) {
            char temp = value[j];
            char temp2 = value[n - j];
            if (!hasSurrogate) {
                hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
                    || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
            }
            value[j] = temp2;
            value[n - j] = temp;
        }
        if (hasSurrogate) {
            // Reverse back all valid surrogate pairs
            for (int i = 0; i < count - 1; i++) {
                char c2 = value;
                if (Character.isLowSurrogate(c2)) {
                    char c1 = value[i + 1];
                    if (Character.isHighSurrogate(c1)) {
                        value[i++] = c1;
                        value = c2;
                    }
                }
            }
        }
        return this;         //你只要看这一句,说了返回的对象就是当前的this,而当前的this是你的StringBuilder这个对象所以不管你前面声明了多少个StringBuilder类型的变量,但是都是给你返回的最开始的那个StringBuilder的对象的内存地址
    }

//希望能帮助到你
回复 使用道具 举报
One_M 中级黑马 2015-4-19 01:06:37
8#
e ...这貌似是共同指向常量池的问题....
回复 使用道具 举报
大牛好多啊。我要加油了
回复 使用道具 举报
Himoriarty 发表于 2015-4-17 11:36
我现在搞不懂的是为什么s是一个字符串,不是应该是对象吗,怎么能将字符串直接给对象名。 ...

s不是字符串啊,是缓冲区。
我图片上不是画了一个区域么
0x0079这个地址对应的就是s这个缓冲区的地址(当然,0079这个地址是我随便捏造的)

你打印s显示的肯定是一个内存地址。
我说s.toString()是转成字符串打印出来。。。
回复 使用道具 举报
Himoriarty 发表于 2015-4-17 11:36
我现在搞不懂的是为什么s是一个字符串,不是应该是对象吗,怎么能将字符串直接给对象名。 ...

我好像懂了,这个跟声明 String字符串一样
回复 使用道具 举报
君嘘 发表于 2015-4-17 02:42
这图片弄的我纠结死……都搞不懂为啥一直上传都是不清晰。
看得懂这图的话就给我分咯
...

我现在搞不懂的是为什么s是一个字符串,不是应该是对象吗,怎么能将字符串直接给对象名。
回复 使用道具 举报
本帖最后由 君嘘 于 2015-4-17 02:42 编辑

看楼下………………

回复 使用道具 举报
举个例子,String str = "aaaa";
System.out.println(str);
打印出来当然是"aaaa"。
StringBuilder stringBuilder = new StringBuilder(); 这时候stringBuilder 是" ";
然后 stringBuilder.append("Welcome");这时候stringBuilder 是"Welcome ";打印出来当然是Welcome。

你new了一个StringBuilder,
StringBuilder stringBuilder = new StringBuilder();
这时在内存中分配了一个空间,stringBuilder 指向这个空间。
然后
StringBuilder stringBuilder1 = stringBuilder.reverse();
这时候stringBuilder1也指向了stringBuilder对象的空间。

你可以这样验证他们是否相等:
                System.out.println(stringBuilder.hashCode());
                System.out.println(stringBuilder.hashCode());
                System.out.println(stringBuilder1==stringBuilder);

打印后你会发现,stringBuilder和stringBuilder的hashCode是一样的。
System.out.println(stringBuilder1==stringBuilder)结果也是true,就能说明他们相等了,都指向了同一个StringBuilder对象。
回复 使用道具 举报
这图片弄的我纠结死……都搞不懂为啥一直上传都是不清晰。
看得懂这图的话就给我分咯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马