String.format()vs字符串连接性能

时间:2014-02-16 00:16:01

标签: java

这两个成语之间的表现有什么不同吗?

String firstStr = "Hello ";
String secStr   = "world";
String third = firstStr +  secStr;

String firstStr = "Hello ";
String secStr   = "world";
String third = String.format("%s%s",firstStr , secStr);

我知道用+运算符连接对性能有害,特别是如果操作很多次,但是String.format()呢?它是一样的还是有助于提高性能?

3 个答案:

答案 0 :(得分:10)

第二个会更慢(如果你看一下String.format()的源代码,你会明白为什么)。这只是因为String.format()执行的代码比简单连接要多得多。在一天结束时,两个代码版本都会创建3个String实例。正如其他人已经指出的那样,使用String.format()还有其他原因,而不是与性能相关的原因。

答案 1 :(得分:7)

首先,我要对免于过早优化作出免责声明。除非您有理由相信这将成为您计划中的热点,否则只需选择最适合您计划的结构。

但是,如果 ,并且希望能够很好地控制连接,只需直接使用StringBuilder即可。这就是内置级联操作所做的事情,并且没有理由认为它很慢。只要你保持相同StringBuilder并继续添加它,而不是冒险连续创建几个(必须是"初始化"使用先前创建的数据),你&#39 ; ll具有适当的O(n)性能。特别是如果您确保以适当的容量初始化StringBuilder

但是,如上所述,StringBuilder是内置连接操作所使用的内容,所以如果你只保留所有连接"内联" - 也就是说,使用A + B + C + D,而不是e = A + B后跟f = C + D后跟e + f(这样,使用相同的StringBuilder并附加String.format在整个操作过程中 - 然后没有理由认为它会很慢。

编辑:在回复您的评论时,我说StringBuilder总是慢一些。即使它以最佳方式附加,它也不能比Formatter 更快地执行(因此也就是连接操作),但它也必须创建一个{{1对象,解析输入字符串,等等。所以还有更多,但它仍然无法更快地完成基本操作。

此外,如果您在内部查看Formatter的工作方式,您会发现它(默认情况下)也使用StringBuilder,就像连接操作一样。因此,它执行完全相同的基本操作 - 即向StringBuilder提供您给它的字符串。它只是以更加迂回的方式做到了。

答案 2 :(得分:1)

如本excellent answer所述,您宁愿使用String.format,但主要是因为本地化问题。

假设您必须为不同语言提供不同的文本,在这种情况下然后使用String.format - 您只需插入新语言(使用资源文件)。但连接会留下混乱的代码。

请参阅:Is it better practice to use String.format over string Concatenation in Java?