【问题标题】:how does stringbuffer/stringbuilder works in memory? how does the stringbuilder.delete function works?stringbuffer/stringbuilder 如何在内存中工作? stringbuilder.delete 函数是如何工作的?
【发布时间】:2019-11-18 05:58:46
【问题描述】:

我添加了一些带有一些字符的 strBuild,并将该 strBuild 放入 stringBuildArr。然后在strBuild上调用java.lang.StringBuilder.delete(int start, int end)函数。

这不仅会从 strBuild 中删除数据,还会从 stringBuildArr 中删除数据。

    StringBuilder strBuild = new StringBuilder();
    StringBuilder stringBuildArr[] = new StringBuilder[10];
    strBuild.append("hgfd");
    stringBuildArr[0] = strBuild;
    System.out.println("Output1: "+stringBuildArr[0]);
    strBuild.delete(0, strBuild.length());
    System.out.println("Output2: "+stringBuildArr[0]);

结果

输出1:hgfd

输出2:

那么,这些 stringbuilder 和 stringbuffer 类的存储是如何工作的?

【问题讨论】:

    标签: java string stringbuilder stringbuffer


    【解决方案1】:

    这里没有“问题”,数组存储了对同一个strBuild实例的引用; stringBuildArr[0] = strBuild; 没有副本,因为复制 StringBuilder 不是免费的。但是如果你想要一个足够简单的副本,请将其更改为

    stringBuildArr[0] = new StringBuilder(strBuild);
    

    【讨论】:

    • 我把它命名为一个问题,因为没有更好的词。 “因为复制 StringBuilder 不是免费的”是什么意思?
    • @elliot,好像不知道怎么问怎么提,他是新人。
    • @vaibhavcool20 这意味着创建StringBuilder 实例的唯一引用副本需要进行复制操作,但并非在所有情况下都需要。简而言之,TANSTAAFL
    【解决方案2】:

    Java StringBuilder 是大多数Java 程序员都熟悉的一个类。字符串是不可变的,因此字符串中的每次更改都会导致创建一个新对象,但是在StringBuilderbuffer 中,它是可变的。这意味着它将在同一个对象上工作,因此删除将删除内容,因此指向同一对象的所有引用将具有相同的行为。

    更多信息请查看官方文档:Java Docs

    【讨论】:

    • 所以,当我调用这个 `stringBuildArr[0] = strBuild;` 时,只共享引用而不共享其内容?
    • @vaibhavcool20 ,是的,逻辑上你可以这么说。最好通过我分享的官方链接,它会消除你所有的疑虑。字符串概念非常广泛,在 Java 世界中应该非常清楚这一点。快乐编码,如果你清楚,请接受答案,它会帮助别人
    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2015-04-12
    • 2020-09-01
    • 2018-03-04
    • 2019-03-19
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    相关资源
    最近更新 更多