我正在写一个MUD(基于文本的游戏)目前使用Java。MUD的一个主要方面是格式化字符串并将其发送回用户。如何最好地实现这一点?
假设我想发送以下字符串:
你对某人说“你好!”-在那里“某人”,“说”和“你好!“都是变量。哪一个是最佳性能明智的?
第一个月
或者是String.format("You %1$s to %2$s \"%3$s\"", verb, user, text)
个
还是其他选择
我不确定哪一个最后会更容易使用(这很重要,因为它会无处不在),但我现在正在考虑它,因为与+的连接会让一些更大的行变得有点混乱。我觉得在这种情况下使用StringBuilder只会使它的可读性更差。
有什么建议吗?
8条答案
按热度按时间yvt65v4c1#
我认为String.format看起来更干净。但是,您可以使用StringBuilder并使用append函数来创建所需的字符串
0lvr5msh2#
最好的,性能方面,可能是使用StringBuffer。
6jjcrrmo3#
如果字符串是使用单个串联表达式生成的;例如。
字符串
那么这或多或少相当于更长的缠绕:
型
事实上,一个经典的Java编译器会将前者编译成后者。在Java 9中,他们实现了JEP 280,它将字节码中的构造函数和方法调用序列替换为单个
invokedynamic
字节码。运行时系统然后优化这个1.当您开始创建中间字符串或使用
+=
等构建字符串时,效率问题就会出现。在某些情况下,使用显式的StringBuilder
可以更有效,因为这样可以减少复制量。现在,当您使用
String.format()
时,它应该在后台使用StringBuilder
。但是,format
还必须在每次调用时解析String格式,如果以最佳方式构建字符串,就不会有这种开销。话虽如此,我的建议是以最易读的方式编写代码。只有当 profiling 告诉您这是一个真实的的性能问题时,才需要考虑构建字符串的最有效方法。(现在,您正在花时间思考解决性能问题的方法,这些问题可能变得微不足道或无关紧要。
另一个答案提到,使用格式字符串可以简化对多种语言的支持。这是真的,尽管在复数、性别等方面你能做的事情是有限的。
1 -因此,对于Java 9或更高版本,按照上面的示例进行手动优化实际上可能会产生 * 负面 * 后果。但这是你每次进行微优化时都要冒的风险。
2 -分析和预测 * 当 * 这种情况发生 * 一般 * 是困难的。
eqzww0vc4#
我认为使用
+
的串联比使用String.format
更易读。String.format
在需要格式化数字和日期时很好。lo8azlld5#
结合plus,编译器可以对代码进行性能化的转换。字符串格式我不知道。
我更喜欢用加号连接,我觉得这样更容易理解。
inn6fuwd6#
保持简单的关键是永远不要看它。我的意思是:
字符串
我使用GuavaJoiner类来使可读性成为一个非问题。还有什么比“加入”更清楚的呢?所有关于连接的讨厌的比特都被很好地隐藏起来。通过使用Iterable,我可以将此方法用于各种数据结构,列表是最明显的。
下面是一个使用Guava ImmutableList的调用示例(它比常规列表更有效,因为任何修改列表的方法都会抛出异常,并且正确地表示了constructMessage()不能更改单词列表的事实,只是消费它):
型
2lpgd9687#
老实说,如果你想减少输入,我建议你选择第一个,如果你想寻找一种更C风格的方式,我建议你选择第二个。
我在这里坐了一两分钟,思考什么可能是一个问题,但我认为这归结于你想输入多少。
还有人有主意吗
46scxncf8#
假设您要经常重用基本字符串,请将模板存储为
字符串mystring =“您$1到$2 "$3"”
然后只需得到一个副本,并用你想要的替换$X。
这对于资源文件来说也很好用。