黑马程序员技术交流社区

标题: StringBuilder创建对象使用函数的问题 [打印本页]

作者: Himoriarty    时间: 2015-4-16 23:10
标题: StringBuilder创建对象使用函数的问题
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Welcome");

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

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

作者: 君嘘    时间: 2015-4-16 23:10
这图片弄的我纠结死……都搞不懂为啥一直上传都是不清晰。
看得懂这图的话就给我分咯

作者: 旺丶财    时间: 2015-4-17 01:51
举个例子,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对象。
作者: 君嘘    时间: 2015-4-17 02:19
本帖最后由 君嘘 于 2015-4-17 02:42 编辑

看楼下………………


作者: Himoriarty    时间: 2015-4-17 11:36
君嘘 发表于 2015-4-17 02:42
这图片弄的我纠结死……都搞不懂为啥一直上传都是不清晰。
看得懂这图的话就给我分咯
...

我现在搞不懂的是为什么s是一个字符串,不是应该是对象吗,怎么能将字符串直接给对象名。
作者: Himoriarty    时间: 2015-4-17 14:40
Himoriarty 发表于 2015-4-17 11:36
我现在搞不懂的是为什么s是一个字符串,不是应该是对象吗,怎么能将字符串直接给对象名。 ...

我好像懂了,这个跟声明 String字符串一样
作者: 君嘘    时间: 2015-4-17 14:54
Himoriarty 发表于 2015-4-17 11:36
我现在搞不懂的是为什么s是一个字符串,不是应该是对象吗,怎么能将字符串直接给对象名。 ...

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

你打印s显示的肯定是一个内存地址。
我说s.toString()是转成字符串打印出来。。。
作者: zhangjialin    时间: 2015-4-18 21:36
大牛好多啊。我要加油了
作者: One_M    时间: 2015-4-19 01:06
e ...这貌似是共同指向常量池的问题....
作者: 1191065242    时间: 2016-5-1 19:42
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的对象的内存地址
    }

//希望能帮助到你





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