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

标签 java string concatenation java-9

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

相关文章:

java - Gradle 派生出多次 war

python - 如何在 python 中将字节作为输入而不进行任何操作?

r - 创建一个向量列表,表示 R 中两个等长向量的第 n 个值之间的整数

java - 如何在数学方程中使用字符串变量名称?

java - 使用 Jackson 开始解析嵌套 JSON 对象

java.lang.IllegalStateException : Could not find matching fulfillment group item for the given order item

Java - 以特定方式切割字符串

python - 根据它们在 python 中的性质,将字符串转换为 float 或整数

c - 在 MacOS 11.6.1 上运行 strncat

Python - 如何连接到 for 循环中的字符串?