Java 链式replaceFirst()调用对于51个调用链是否效率低下?

Java 链式replaceFirst()调用对于51个调用链是否效率低下?,java,string,replace,Java,String,Replace,我正在编写一些基于模板的代码,通过将调用链接到String.replaceFirst()来填充占位符。收集数据以替换占位符后,这一行将生成完整的表单 String completedForm = template.replaceFirst("account_number",account_number).template.replaceFirst("customer_id",customer_id)... 49 more in the chain 我想知道这种方法是否成本高昂,因为它在构建c

我正在编写一些基于模板的代码,通过将调用链接到String.replaceFirst()来填充占位符。收集数据以替换占位符后,这一行将生成完整的表单

String completedForm = template.replaceFirst("account_number",account_number).template.replaceFirst("customer_id",customer_id)... 49 more in the  chain
我想知道这种方法是否成本高昂,因为它在构建completedForm的过程中创建了51个字符串对象


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

这样做可能是最有效的。除非您知道这是一个性能问题,否则我不会尝试猜测它可能是一个性能问题,并将其放在一些更复杂的东西中,这些东西最终可能不会有太大的区别


如果你想让你的代码更快,我建议你先用一个分析器对它进行分析,然后处理那些你认为你花费了最多时间的事情。

不,这不是一种特别有效的方法

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

如果是,你可以考虑你想替换什么,让节点包含你想用它替换的东西。然后,您需要迭代该字符串,并在执行时在trie中进行查找,使用

StringBuilder
或仅使用连接的常规字符串构建结果字符串


无论使用哪种方法,为了防止代码量过多,(因为我看到您提到的所有替换都是用同名变量替换字符串,不确定这是否只是一个示例规则),我的第一个想法是,尽管如果可以避免,并不建议使用生产级代码,或者只是一个映射而不是变量。

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

用你的方法,我会更关心正确性。您是否完全100%确定先前的
replaceFirst()
中的替换字符串都不可能与以后的
replaceFirst()
中的“占位符”键匹配?如果这个“表单”使用的是网页上的数据,那么狡猾的攻击者可能会利用这个问题,说他们的名字是“账号”之类的


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

这里的
模板是什么?您当前的代码似乎根本无法编译。在任何情况下,都会为每个替换的结果创建一个新的
字符串
对象。更重要的是,考虑到您的初始输入,这看起来像是XY问题的一个主要示例。感谢您的深思熟虑的评论。我想我应该指出我认为的链锁的替代品是什么。我正在考虑使用StringBuilder()并将表单的每个“部分”定义为静态字符串。当完整的表单被构建时,它将是静态和动态部分的浓缩。例如:在我输入示例之前就切断了自己的连接。由于某些原因,我无法输入示例。再试一次。