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

新手上路,请多包涵

我现在正在使用 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 许可协议

阅读 426
2 个回答

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

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 ,它将字节码中的构造函数和方法调用序列替换为单个 invokedynamic 字节码。然后运行时系统优化这个1 。

当您开始创建中间字符串或使用 += 等构建字符串时,会出现效率问题。在这一点上, StringBuilder 变得更有效率,因为你减少了创建然后丢弃的中间字符串的数量。

现在,当您使用 String.format() 时,它应该在引擎盖下使用 StringBuilder 。但是, format 还必须在每次调用时解析格式字符串,如果您以最佳方式构建字符串,那么这是一个开销。


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

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


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

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为与 + 的连接比使用 String.format 更具可读性。

String.format 当您需要格式化数字和日期时非常有用。

原文由 user997135 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题