- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想知道 StringBuilder,我有一个问题希望社区能够解释。
让我们忘掉代码的可读性,哪些是更快,为什么?
StringBuilder.Append
:StringBuilder sb = new StringBuilder();
sb.Append(string1);
sb.Append("----");
sb.Append(string2);
StringBuilder.AppendFormat
:StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}----{1}",string1,string2);
最佳答案
不好说,不知道string1
和string2
的大小。
通过调用 AppendFormat
,它将根据格式字符串的长度和将要插入的字符串预分配一次缓冲区,然后连接所有内容并将其插入缓冲区。对于非常大的字符串,这将优于单独调用 Append
这可能会导致缓冲区多次扩展。
但是,对 Append
的三个调用可能会也可能不会触发缓冲区的增长,并且每次调用都会执行该检查。如果字符串足够小并且没有触发缓冲区扩展,那么它将比调用 AppendFormat
更快,因为它不必解析格式字符串来确定在何处进行替换。
需要更多数据才能得出明确的答案
应该注意的是,很少讨论使用静态 Concat
method on the String
class (Jon's answer 使用 AppendWithCapacity
让我想起了这一点)。他的测试结果表明这是最好的情况(假设您不必利用特定的格式说明符)。 String.Concat
做同样的事情,因为它会预先确定要连接的字符串的长度并预分配缓冲区(由于通过参数循环构造,开销会稍微多一些)。它的性能将与 Jon 的 AppendWithCapacity
方法相媲美。
或者,只是简单的加法运算符,因为无论如何它都会编译为对 String.Concat
的调用,但需要注意的是所有加法都在同一个表达式中:
// One call to String.Concat.
string result = a + b + c;
不
// Two calls to String.Concat.
string result = a + b;
result = result + c;
对于所有提交测试代码的人
您需要在单独 运行中运行您的测试用例(或者至少,在单独测试运行的测量之间执行 GC)。这样做的原因是如果你说,1,000,000 次运行,创建一个新的 StringBuilder
在一个测试循环的每次迭代中,然后运行下一个循环相同次数的测试,创建 额外 1,000,000 个 StringBuilder
实例,GC 将更多而不是在第二次测试期间介入并阻碍其时机。
关于c# - StringBuilder.Append 与 StringBuilder.AppendFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/710504/
公共(public)类TestMyStringBuilderII { public static void main(String[] args) { StringBuilder sb = n
我们都知道字符串是不可变的而StringBuilder是可变的。正确的。那么为什么它的方法会返回一个 StringBuilder 对象。它们不应该都是 void 方法吗? 为什么会这样 public
当我读到 equals() 方法用于比较 java 中的字符串是否相等但是当我运行这段代码时我得到输出 false 。为什么? public class TestStringBuilder { pu
我收到一份模型列表。模型的数量可能很大。这个模型有一堆属性,其中任何一个都可能是null。 我需要根据模型的属性为每个模型构建一个字符串。如果 property == null,那么我会在结果字符串中
我写了一些代码,其中有很多字符串创建。为了尽量避免一遍又一遍地创建昂贵的字符串,我使用了 java StringBuilder 类。 我的代码有点像这样: public String createSt
这个问题在这里已经有了答案: 关闭10年前。 Possible Duplicate: StringBuilder vs String concatenation in toString() in Ja
类 StringBuilder 定义了四个构造函数,它们都不接受 StringBuilder,但以下编译: StringBuilder sb = new StringBuilder(new Strin
我正在努力在我的代码中使用 StringBuilder,而不是 String使代码在所有解析和连接过程中具有时间效率。 但是当我查看它的源代码时,substring() 方法AbstractStrin
我想知道 StringBuilder,我有一个问题希望社区能够解释。 让我们忘掉代码的可读性,哪些是更快,为什么? StringBuilder.Append: StringBuilder sb = n
这个问题在这里已经有了答案: Single exclamation mark in Kotlin (6 个回答) Example of when should we use run, let, app
我已经附加了一些带有一些字符的 strBuild 并将该 strBuild 放入 stringBuildArr 中。然后在strBuild上调用java.lang.StringBuilder.dele
在 C# 中哪个内存效率更高:选项 #1 还是选项 #2? public void TestStringBuilder() { //potentially a collection with
当使用 StringBuilder.ToString() 时,我遇到了 OutOfMemory 异常。因为我的字符串需要很大的空间。这就是为什么我需要一种方法(也许通过流式传输)来让它工作。 这是我的
这个问题已经有答案了: What's the difference between instance method reference types in Java 8? (3 个回答) 已关闭 7 年
这个问题在这里已经有了答案: What's the difference between instance method reference types in Java 8? (3 个答案) 关闭
最近的 question came up关于使用 String.Format()。我的部分回答包括使用 StringBuilder.AppendLine(string.Format(...)) 的建议
在 SO 上看到一个关于连接字符串的问题后,我做了一些测试,了解到在 foreach 中连接字符串比使用 for 循环和使用数组中的索引慢。由于对数组进行绑定(bind)检查,for 循环不应该变慢吗
我的问题是如果我有时在同一个字符串上使用多线程 字符串不会被替换。(我在记事本上写了这个,所以语法可能是 错误) 使用 System.Thread ...当然还有其他 class .... {
如果我创建一个不可变类。所有字段都必须是最终的。如果我像这样使用 stringbuilder final StringBuilder s = new StringBuilder("你好"); ,那么
是否可以配置 Java StringBuilder类在每次调用之间追加一个新行以追加? 最佳答案 我不认为 StringBuilder内置了该功能。既然你不能只是扩展它,你可以尝试使用装饰器模式...
我是一名优秀的程序员,十分优秀!