我们必须一直为日志(log)输出构建字符串等等.在JDK版本中,我们学习了何时使用StringBuffer(多个附件,线程安全)和StringBuilder(多个附件,非线程安全).

关于使用String.format()有什么建议吗?它是高效的,还是我们被迫在性能很重要的一行程序中坚持串联?

e、 g.丑陋的旧风格,

String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";

与整洁的新样式(String.format,可能更慢)相比,

String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);

注意:我的特定用例是我的代码中有数百个"一行"日志(log)字符串.它们不涉及循环,所以StringBuilder太重量级了.我对String.format()特别感兴趣.

推荐答案

我写了一个小类来测试,它的性能比这两个类都好,而且+比格式更先进.以5到6的倍数.

import java.io.*;
import java.util.Date;

public class StringTest{

    public static void main( String[] args ){
    int i = 0;
    long prev_time = System.currentTimeMillis();
    long time;

    for( i = 0; i< 100000; i++){
        String s = "Blah" + i + "Blah";
    }
    time = System.currentTimeMillis() - prev_time;

    System.out.println("Time after for loop " + time);

    prev_time = System.currentTimeMillis();
    for( i = 0; i<100000; i++){
        String s = String.format("Blah %d Blah", i);
    }
    time = System.currentTimeMillis() - prev_time;
    System.out.println("Time after for loop " + time);

    }
}

对不同的N运行上面的命令会显示两者的行为都是线性的,但是String.format要慢5-30倍.

原因是在当前的实现中,String.format首先用正则表达式解析输入,然后填充参数.另一方面,与plus的连接通过javac(而不是JIT)进行优化,并直接使用StringBuilder.append.

运行时比较

Java相关问答推荐

Gmail Javi API批量处理太多请求

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

为什么如果数组列表中有重复项,我的代码SOMETIMES不返回true?

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

屏蔽字母数字代码的Java正则表达式

嵌入式ActiveMQ Artemis Web控制台加载错误

存根基类的受保护方法

Chunk(Int)已弃用并标记为要删除

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

JOOQ中的子查询使用的是默认方言,而不是配置的方言

测试容器无法加载类路径初始化脚本

用OSQL创建索引

有谁能帮我修一下这个吗?使输出变得更加整洁

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

在JDK Flight Recorder中只记录单个线程

用于Java的Visual Studio代码完成不起作用

Hibernate 命名策略导致 Java Spring Boot 应用程序中出现未知列错误

更新不可变的深层嵌套字段

Spring Boot应用程序中的自定义constraintvalidator不会被调用