我现在正在使用 java 编写 MUD(基于文本的游戏)。 MUD 的主要方面之一是格式化字符串并将其发送回用户。如何最好地实现这一点?
假设我想发送以下字符串:
你对某人说“你好!” - 其中“某人”、“说”和“你好!”都是变量。哪个是最好的性能明智?
"You " + verb + " to " + user + " \"" + text + "\""
或者
String.format("You %1$s to %2$s \"%3$s\"", verb, user, text)
还是其他选择?
我不确定最终哪个更容易使用(这很重要,因为它无处不在),但我现在正在考虑它,因为与 + 连接有点混乱一些较大的线路。我觉得在这种情况下使用 StringBuilder 只会降低它的可读性。
这里有什么建议吗?
原文由 two13 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果字符串是使用单个连接表达式构建的;例如
那么这或多或少相当于更冗长的:
事实上,一个经典的 Java 编译器会将前者编译成后者……差不多。在 Java 9 中,他们实现了 JEP 280 ,它将字节码中的构造函数和方法调用序列替换为单个
invokedynamic
字节码。然后运行时系统优化这个1 。当您开始创建中间字符串或使用
+=
等构建字符串时,会出现效率问题。在这一点上,StringBuilder
变得更有效率,因为你减少了创建然后丢弃的中间字符串的数量。现在,当您使用
String.format()
时,它应该在引擎盖下使用StringBuilder
。但是,format
还必须在每次调用时解析格式字符串,如果您以最佳方式构建字符串,那么这是一个开销。话虽如此,我的建议是以最易读的方式编写代码。如果 分析 告诉您这是一个真正的性能问题,则只需担心构建字符串的最有效方法。 (现在,您正在花时间思考如何解决可能被证明是微不足道或无关紧要的性能问题。)
另一个答案提到使用格式字符串可以简化对多种语言的支持。这是事实,尽管在诸如复数、性别等方面你能做的事情是有限的。
1 - 因此,对于 Java 9 或更高版本,根据上面的示例进行手动优化实际上可能会产生 负面 影响。但这是您在微优化时承担的风险。