对于一连串的51个调用,链接replaceFirst()调用是否效率低下?

时间:2013-08-08 16:20:39

标签: java string replace

我正在研究一些基于模板的代码,通过链接对String.replaceFirst()的调用来填充占位符。在收集数据以替换占位符之后,这一行构建完成的表单。

String completedForm = template.replaceFirst("account_number",account_number).template.replaceFirst("customer_id",customer_id)... 49 more in the  chain

我想知道这种方法是否非常昂贵,因为它在构建completedForm的过程中创建了51个String对象。

从效率的角度来看,这是最佳方式吗?

3 个答案:

答案 0 :(得分:3)

以这种方式执行它可能是最有效的。除非你知道这是一个性能问题,否则我不会猜测它可能是什么并且放入一些更复杂的东西,最终可能没什么区别。

如果您希望代码更快,我建议您先使用分析器对其进行分析,然后处理它建议您花费最多时间的事情。

答案 1 :(得分:0)

不,这不是一种特别有效的做事方式。

是否值得花时间去改进它取决于你的程序做了什么,目前是否占用了该程序的大部分处理时间。

如果是,您可以将a trie与您想要替换的内容一起考虑,并让节点包含您想要替换它的内容。然后你需要遍历字符串并在trie中进行查找,使用StringBuilder构建结果字符串,或者使用连接构建常规字符串。

使用任何一种方法,以防止过多的代码,(因为我看到你提到的所有替换都是用一个具有相同名称的变量替换一个字符串,不确定这是否只是一个例子的规则)我的第一个想法是reflection,虽然如果可以避免使用生产级代码,或者只是地图而不是变量,它并不是真的建议。

答案 2 :(得分:0)

对我而言,表现方面看起来并不坏。如果相对于其他类型的操作,创建新String的操作非常昂贵,我可以考虑解决问题的其他方法,例如首先搜索所有占位符名称并创建一个数组标记模板中需要替换的字符,然后使用StringBuilder将所有内容拼凑在一起。但我怀疑分配一个新的字符串要贵得多(虽然我还没有尝试过),我怀疑(像彼得一样)添加一个复杂的解决方案并没有太大的区别,可能会让事情变得更糟。

用你的方法,我会更关心正确性。你是绝对的,100%确定早期replaceFirst()中的替换字符串中的所有替换字符串都不能与后来replaceFirst()中的“占位符”键匹配吗?如果这个“形式”是使用来自网页的数据的东西,那就是棘手的攻击者可以利用的一般问题,通过说他们的名字是“account_number”或类似的东西。

编辑:还有一件事:replaceFirst()特别在第二个参数中处理$和\。如果其中一个替换字符串有可能包含其中一个字符,您将需要处理它(请参阅Matcher.quoteReplacement)。