gpt4 book ai didi

java - for 循环中的字符串连接。 Java 9

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:25 24 4
gpt4 key购买 nike

如有错误请指正。在 Java 8 中,出于性能原因,当通过“+”运算符连接多个字符串时,会调用 StringBuffer。并且“解决”了创建一堆中间字符串对象污染字符串池的问题。

Java 9 呢?添加了一个新功能作为 Invokedynamic。一个新类 StringConcatFactory 更好地解决了这个问题。

String result = "";
List<String> list = Arrays.asList("a", "b", "c");
for (String n : list) {
result+=n;
}

我的问题是:在这个循环中创建了多少个对象?有没有中间对象?我该如何验证?

最佳答案

作为记录,这里有一个JMH测试...

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
@State(Scope.Thread)
public class LoopTest {

public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder().include(LoopTest.class.getSimpleName())
.jvmArgs("-ea", "-Xms10000m", "-Xmx10000m")
.shouldFailOnError(true)
.build();
new Runner(opt).run();
}

@Param(value = {"1000", "10000", "100000"})
int howmany;

@Fork(1)
@Benchmark
public String concatBuilder(){
StringBuilder sb = new StringBuilder();
for(int i=0;i<howmany;++i){
sb.append(i);
}
return sb.toString();
}

@Fork(1)
@Benchmark
public String concatPlain(){
String result = "";
for(int i=0;i<howmany;++i){
result +=i;
}
return result;
}
}

产生我没想到的结果(仅针对此处显示的 100000):

LoopTest.concatPlain       100000  avgt    5  3902.711 ± 67.215  ms/op
LoopTest.concatBuilder 100000 avgt 5 1.850 ± 0.574 ms/op

关于java - for 循环中的字符串连接。 Java 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49458564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com