这两个成语之间的表现有什么不同吗?
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()呢?它是一样的还是有助于提高性能?
答案 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?