Java 连接以构建字符串或格式

我目前正在使用java编写MUD(基于文本的游戏)。MUD的主要方面之一是格式化字符串并将其发送回用户。如何最好地实现这一目标?

假设我想发送以下字符串:

你对某人说“你好!”——其中“某人”、“说”和“你好!”都是变量。哪个是性能最好的?

"You " + verb + " to " + user + " \"" + text + "\""

String.format("You %1$s to %2$s \"%3$s\"", verb, user, text)

还是其他选择?

我不确定最终哪个会更容易使用(这很重要,因为它无处不在),但我正在考虑这一点,因为与+的连接与一些较大的行有点混淆。我觉得在这种情况下使用StringBuilder只会使它的可读性更差。

有什么建议吗?


答案 1

如果字符串是使用单个串联表达式构建的;例如:

String s = "You " + verb + " to " + user + " \"" + text + "\"";

那么这或多或少等同于更长的蜿蜒曲折:

StringBuilder sb = new StringBuilder();
sb.append("You");
sb.append(verb);
sb.append(" to ");
sb.append(user);
sb.append(" \"");
sb.append(text );
sb.append('"');
String s = sb.toString();

实际上,经典的Java编译器会将前者编译为后者...几乎。在Java 9中,他们实现了JEP 280,它将字节码中的构造函数和方法调用序列替换为单个字节码。然后,运行时系统将优化此1invokedynamic

当您开始创建中间字符串或使用等构建字符串时,效率问题会出现。此时,将变得更加高效,因为您可以减少创建然后丢弃的中间字符串的数量。+=StringBuilder

现在当你使用时,它应该使用引擎盖下。但是,每次进行调用时还必须解析 String 格式,如果以最佳方式构建字符串,则不会有开销。String.format()StringBuilderformat


话虽如此,我的建议是以最易读的方式编写代码。只有当分析告诉您这是一个真正的性能问题时,才担心构建字符串的最有效方法。(现在,您正在花时间思考如何解决可能无关紧要或无关紧要的性能问题。

另一个答案提到,使用格式字符串可以简化对多种语言的支持。这是真的,尽管在复数,性别等事情上你可以做什么是有限的。


1 - 因此,对于 Java 9 或更高版本,上述示例的手牌优化实际上可能会产生负面影响。但这是您在微优化时要承担的风险。


答案 2

与 plus 连接,编译器可以以执行方式转换代码。用字符串格式我不知道。

我更喜欢与加号一起串联,我认为这比欠沙更容易。


推荐