当前位置: 首页 > 知识库问答 >
问题:

每次调用 StringBuffer#toString 和 StrinBuilder#toString 都会从字符串池中返回新的实例或实例?

萧伟兆
2023-03-14

我的问题是,如果我使用StringBuffer(或StringBuilder),如果我在实例上多次调用String方法。StringBuffer 是每次都返回 String 的新实例,还是从 String pool 返回 String?(假设我在两次调用之间没有对StringBuffer进行任何更改)

共有3个答案

端木宏盛
2023-03-14

是的,调用 StringBuffer 和 StringBuilderstringIng 方法将每次都创建一个新的字符串对象,因为这些方法使用 new 关键字返回字符串。

下面是 toString from StringBuffer 类的代码

  public synchronized String toString() {
        return new String(value, 0, count);
    }

下面是StringBuilder类中的toString方法:

public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
鲁丰
2023-03-14

只有字符串文本放置在字符串常量池中。例如,字符串 s = “abc”; 将在字符串池中,而字符串 s = new String(“abc”) 则不会。toString() 方法创建了一个新字符串,因此返回的字符串不会来自文本池。

每当遇到toString()方法时,都会创建一个新的String。

仅当您执行以下操作时,才会再次引用字符串常量池对象。

String s = "abc";
String s1 = "abc";

这意味着引用变量 ss1 都将引用常量池中的相同 abc 文本。

您可以在此处找到有关字符串常量池的有用文章。http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

淳于禄
2023-03-14

根据StringBuffer的toString()文档

转换为表示此字符串缓冲区中数据的字符串。分配并初始化一个新的字符串对象,以包含该字符串缓冲区当前表示的字符序列。然后返回该字符串。对字符串缓冲区的后续更改不会影响字符串的内容。

因此,分配并初始化了一个新的 String 对象。

通过new运算符分配的String对象存储在堆中,相同内容不共享存储,其中作为String文字存储在公共池中。

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

其中s1==s2==s3但s4!=s5

 类似资料:
  • 我是依赖注入的新手,最近不得不学习Spring和Guice。下面的问题可能很蹩脚。 Spring允许您创建带有@scope(“prototype”)注释的原型对象,这意味着每次都会返回一个新对象 例如在我的Spring容器中:- 并在@AutoWired的所有引用中注入一个新对象a。 但是,在guice注入器中,正在注入相同的实例。看起来guice只提供单例、请求或会话作用域https://git

  • 本文向大家介绍JavaScript中用toString()方法返回时间为字符串,包括了JavaScript中用toString()方法返回时间为字符串的使用技巧和注意事项,需要的朋友参考一下  此方法返回表示指定日期对象的字符串。 语法 下面是参数的详细信息:     NA 返回值: 返回表示指定日期对象的字符串 例子: 这将产生以下结果:

  • 问题内容: 我有一个带有参数的方法。 在这种方法中,我完全知道在“ o”中存在一个不为空的值。无需检查或执行其他操作。我必须把它当作一个对象来对待。 只是好奇-什么便宜?将其投放或使用?还是按时间/ CPU /内存价格相同? 更新:该方法可以接受,因为它是接口的实现。无法更改参数类型。 而且根本不可能。我只是想说我不需要检查它是否为空或为空。就我而言,总是有一个非空字符串。 问题答案: 强制转换为

  • 我正在通过SonarLint传递我的代码,我遇到了这个linter违规:上调用。 这是我的代码: SonarLint给出了以下代码片段,作为改进代码的提示: 我应该如何更改代码以满足linter的要求?为什么?

  • 理想情况下,我希望类似于myerrors.bad_file_path-->这样的东西,它返回一个字符串,这样它就不那么冗长了。这有道理吗?

  • 本文向大家介绍java中的 toString()方法实例代码,包括了java中的 toString()方法实例代码的使用技巧和注意事项,需要的朋友参考一下 前言:       toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据。   最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理。   处理要求把集合数