1

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

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

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

从效率的角度来看,这是最好的方法吗?

4

3 回答 3

3

这样做可能对你来说是最有效的。除非您知道这是一个性能问题,否则我不会尝试猜测它可能是并放入一些更复杂的东西,最终可能不会有太大的不同。

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

于 2013-08-08T16:22:31.450 回答
0

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

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

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

于 2013-08-08T17:06:04.163 回答
0

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

是否值得投入时间来改进它取决于您的程序还做了什么,这是否占用了程序处理时间的很大一部分。

如果是这样,您可以考虑使用您想要替换的内容进行尝试,并让节点包含您想要替换的内容。然后,您需要遍历字符串并随时在 trie 中进行查找,使用 aStringBuilder或仅使用连接的常规字符串构建结果字符串。

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

于 2013-08-08T16:29:46.993 回答