如有错误请指正。在 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/