在Java中使用String.format而不是字符串连接是更好的做法吗?

问题

在Java中使用String.Format和字符串连接之间是否存在明显的差异?

我倾向于使用String.format但偶尔会滑倒并使用concat。我想知道一个人是否比另一个好。

我看到它的方式,String.Format给你"格式化"字符串更多的权力;和连接意味着你不必担心意外地添加额外的%s或丢失一个%s。

String.format也更短。

哪一个更具可读性取决于你的头部如何工作。


#1 热门回答(193 赞)

我建议使用String.format()是更好的做法。主要原因是String.format()可以更容易地使用从资源文件加载的文本进行本地化,而连接不能在没有为每种语言生成具有不同代码的新可执行文件的情况下进行本地化。

如果你计划将应用程序设置为可本地化,那么你还应养成为格式标记指定参数位置的习惯:

"Hello %1$s the time is %2$t"

然后可以对其进行本地化,并且可以交换名称和时间令牌,而无需重新编译可执行文件以考虑不同的顺序。使用参数位置,你还可以重复使用相同的参数,而无需将其传递给函数两次:

String.format("Hello %1$s, your name is %1$s and the time is %2$t", name, time)

#2 热门回答(117 赞)

关于表现:

public static void main(String[] args) throws Exception {      
  long start = System.currentTimeMillis();
  for( int i=0;i<1000000; i++){
      String s = "Hi " + i + "; Hi to you " + i*2;
  }
  long end = System.currentTimeMillis();
  System.out.println("Concatenation = " + ((end - start)) + " millisecond") ;

  start = System.currentTimeMillis();
     for( int i=0;i<1000000; i++){
         String s = String.format( "Hi %s; Hi to you %s",i, + i*2);
     }
     end = System.currentTimeMillis();
     System.out.println("Format = " + ((end - start)) + " millisecond");
   }

时间结果如下:

  • 连接= 265毫秒
  • 格式= 4141毫秒

因此,连接比String.format快得多。


#3 热门回答(32 赞)

由于有关性能的讨论,我想我会添加一个包含StringBuilder的比较。它实际上比concat更快,自然是String.format选项。

为了使这成为一种苹果与苹果的比较,我在循环中而不是在外部实例化一个新的StringBuilder(这实际上比仅进行一次实例化更快,这很可能是由于在结束时为循环附加重新分配空间的开销。一个建设者)。

String formatString = "Hi %s; Hi to you %s";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String s = String.format(formatString, i, +i * 2);
    }

    long end = System.currentTimeMillis();
    log.info("Format = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        String s = "Hi " + i + "; Hi to you " + i * 2;
    }

    end = System.currentTimeMillis();

    log.info("Concatenation = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        StringBuilder bldString = new StringBuilder("Hi ");
        bldString.append(i).append("; Hi to you ").append(i * 2);
    }

    end = System.currentTimeMillis();

    log.info("String Builder = " + ((end - start)) + " millisecond");
  • 2012-01-11 16:30:46,058 INFO [TestMain] - 格式= 1416毫秒
  • 2012-01-11 16:30:46,190 INFO [TestMain] - 连接= 134毫秒
  • 2012-01-11 16:30:46,313 INFO [TestMain] - String Builder = 117毫秒