【问题标题】:Java improve the performance of concatenating Strings in a loopJava 提高了在循环中连接字符串的性能
【发布时间】:2020-10-20 17:28:55
【问题描述】:

我正在用 Java 编写一个函数,可以简化如下:

StringBuilder s = new StringBuilder(50);
Queue<String> q = new LinkedList<>();
for(some condition){
   s.setLength(0);
   s.append("...").append("...").append("...").append("...");//add several strings to s
   q.add(s.toString());
}

我将这些字符串保存在队列 q 中,如果队列的大小大于某个值,它会将 q 写入数据库。然而,它变得很慢,尤其是当循环次数很大(数百万)时。我认为这是因为连接需要大量时间。那么有没有更好的方法来进行连接?提前感谢您的帮助!

更新: 我想使用相同的 StringBuilder 来创建字符串,所以每次我使用 s.setLength(0) 在每个循环开始时重置它。这些字符串是新节点的信息,比如它的ID和一些属性,所以我需要通过调用一些函数来检索这些信息,并将它们附加到字符串s。其背后的想法是当队列达到特定大小时,我会从该队列中弹出信息以创建节点到 Neo4j 数据库,因为如果我为每个新节点使用一个事务会花费更多。

【问题讨论】:

  • 为什么不只创建一次该字符串?它总是一样的。
  • 因此,您将每个字符串推入队列,当达到某个队列大小时,您将队列中的所有元素附加到字符串生成器(连接到一个字符串)并将该值写入数据库?
  • 如果您将实际代码粘贴到您要附加的那些字符串的来源处,这可能会有所帮助。还有为什么 s.setLength(0) 在循环开始时,也许你可以提前计算缓冲区的大小,避免在追加时重新计算
  • @akuzminykh 那是因为这些字符串是新节点及其属性的信息,我需要通过调用一些函数来一一获取这些信息。
  • 同意@Gubatron - 使用足够大的(或仅链表)

标签: java string loops concatenation


【解决方案1】:

如果您正在调用函数来获取字符串,那么最快的方法是根本不使用StringBuilder。相反,请使用concat() 函数,这在性能方面是最好的。

这是一个例子:

Queue<String> q = new LinkedList<>();
for(any condition){
  q.add(getStringOne().concat(getStringTwo()).concat(getStringThree()));
}

更新:因此,在这种情况下 Builder 比 concat 更好的评论之后。我进行了一些测试。与concat() 相比,StringBuilder 花费的时间超过 2 倍。这是因为我们不是使用循环来创建单个字符串,而是在每次迭代时创建一个新字符串。

这是我用来执行测试的repl:https://repl.it/@ankitbeniwal/StringBuilderVersusStringConcat

【讨论】:

  • Builder 速度更快。
  • @Antoniossss 毫无疑问,当我们使用循环时,我们应该使用StringBuilder。但在这种情况下,我们每次迭代都会创建一个新字符串。你能放点光吗?
  • 而且我认为这正是速度较慢的确切原因 - 因为在每次迭代中创建(此处)3个不同的字符串而不是附加到一个(不是一个)。我做了小基准测试,因为我对结果很好奇。生病下班后我可以稍后分享代码。 (同时你可以自己比较)
猜你喜欢
  • 2011-02-15
  • 2020-11-30
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2023-03-11
  • 2014-02-02
  • 2020-08-25
相关资源
最近更新 更多