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

JAVA8中3字串级联的最有效方法

罗寒
2023-03-14

我有一个Java8中的多线程Http服务器,它每秒获得数千个请求,并且必须创建需要字符串连接的响应。这个问题最好(最快)的解决方案是什么?

我知道,StringBuilder通常比+操作符具有更好的性能,我认为StringBuilder将是最好的解决方案,但在这种情况下,我必须为每个请求初始化新的StringBuilder。

而且,在我的问题中,串联总是需要3个字符串-其中两个是final字符串,中间一个是变量。该变量可以从~20个不同元素的集合中取值。因此,可能的串联字符串的数量等于20 x number_of_different_strings,即大约2000个。

是使用StringBuilder更好,还是仅仅连接字符串(数量不会超过2K个不同的字符串),还是最好将所有创建的字符串(大约2K)存储在map中,并每次请求特定的字符串?

共有1个答案

岳和泽
2023-03-14

我知道通常StringBuilder+操作符的性能好得多

这并不完全正确。实际上,当您使用+运算符时,Java编译器会将其转换为在编译的代码中使用StringBuilder

问题如下。请看下面的代码:

String[] names = {"Joe", "Susan", "Fred", "Mary"};

String result = "";
for (String name : names) {
    result = result + name;
}
for (String name : names) {
    StringBuilder sb = new StringBuilder(result);
    sb.append(name);
    result = sb.toString();
}

直接使用StringBuilder可以编写更高效的代码:

StringBuilder sb = new StringBuilder();
for (String name : names) {
    sb.append(name);
}
String result = sb.toString();

这样,在循环中的每次迭代中,只创建一个StringBuilder对象,并且不会将数据复制到该对象和String中。

如果您的代码不涉及在循环中追加许多字符串,而只需要连接三个字符串,那么显式使用+StringBuilder都无关紧要。事实上,使用+编写的代码将被编译成与手动使用StringBuilder时编写的代码完全相同的代码。

 类似资料:
  • 问题内容: 在JavaScript中,我有一个包含许多迭代的循环,并且在每个迭代中,我正在创建一个包含许多运算符的巨大字符串。有没有更有效的方式来创建字符串?我正在考虑创建一个动态数组,在该数组中不断向其中添加字符串,然后进行联接。谁能解释并举例说明最快的方法吗? 问题答案: 基于JSPerf的基准测试,似乎是使用最快的方法,尽管不一定在每个浏览器中都使用。 为了在DOM中构建字符串,最好先将字符

  • 我正在使用RxVertx,它是一种RxJava和Java8,我有一个编译错误。 这是我的代码: 编译错误是:“在封闭范围内定义的局部变量游戏必须是最终的或有效的最终的” 我无法将“game”定义为final,因为我在函数末尾执行分配\set并返回它。 如何编译此代码? 谢了。

  • 问题内容: 我有一个可变长度的列表,正在尝试寻找一种方法来测试当前正在评估的列表项是否是列表中包含的最长字符串。我正在使用Python 2.6.1 例如: 当然,有一个简单的列表理解功能很简短,但我却忽略了它? 问题答案: 从Python文档本身,您可以使用:

  • 问题内容: 我知道使用“ +”串联运算符来构建字符串效率很低,这就是为什么建议使用StringBuilder类的原因,但是我想知道这种模式是否也效率低下? 我猜这里编译器会优化分配,好吗? 问题答案: 该特定示例将由编译器内联: Java 9+将使用带有makeConcatWithConstants的invokedynamic来内联此代码,以使其高效。根据输出: 但是,如果 and 是编译时间常数

  • 问题内容: 给出下表 给定一个,我需要找到其顶级父级()。 每天执行50-100次此查询。当前有100-200行(将来可能会更多)。多达8个层次的深度。我在考虑三种选择: 使用递归方法 创建一个视图 添加另一列(最不满意) 哪个效率最高? 问题答案: SQL2008 +: 为了存储层次结构,SQL Server包含HIERARCHYID数据类型。可以将上述数据“转换为”以使用“值”: 转换后,我将

  • 问题内容: 在Go中,a 是原始类型,这意味着它是只读的,对其的每次操作都会创建一个新的字符串。 因此,如果我想多次连接字符串而又不知道结果字符串的长度,那么最好的方法是什么? 天真的方法是: 但这似乎不是很有效。 问题答案: 新方法: 在Go 1.10+中strings.Builder,这里是。 生成器用于使用Write方法有效地构建字符串。它最大程度地减少了内存复制。零值可以使用了。 与几乎相