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

y1aodyip  于 2023-08-02  发布在  Java
关注(0)|答案(8)|浏览(135)

我正在写一个MUD(基于文本的游戏)目前使用Java。MUD的一个主要方面是格式化字符串并将其发送回用户。如何最好地实现这一点?
假设我想发送以下字符串:
你对某人说“你好!”-在那里“某人”,“说”和“你好!“都是变量。哪一个是最佳性能明智的?
第一个月
或者是
String.format("You %1$s to %2$s \"%3$s\"", verb, user, text)
还是其他选择
我不确定哪一个最后会更容易使用(这很重要,因为它会无处不在),但我现在正在考虑它,因为与+的连接会让一些更大的行变得有点混乱。我觉得在这种情况下使用StringBuilder只会使它的可读性更差。
有什么建议吗?

yvt65v4c

yvt65v4c1#

我认为String.format看起来更干净。但是,您可以使用StringBuilder并使用append函数来创建所需的字符串

0lvr5msh

0lvr5msh2#

最好的,性能方面,可能是使用StringBuffer。

6jjcrrmo

6jjcrrmo3#

如果字符串是使用单个串联表达式生成的;例如。

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还必须在每次调用时解析String格式,如果以最佳方式构建字符串,就不会有这种开销。
话虽如此,我的建议是以最易读的方式编写代码。只有当 profiling 告诉您这是一个真实的的性能问题时,才需要考虑构建字符串的最有效方法。(现在,您正在花时间思考解决性能问题的方法,这些问题可能变得微不足道或无关紧要。
另一个答案提到,使用格式字符串可以简化对多种语言的支持。这是真的,尽管在复数、性别等方面你能做的事情是有限的。
1 -因此,对于Java 9或更高版本,按照上面的示例进行手动优化实际上可能会产生 * 负面 * 后果。但这是你每次进行微优化时都要冒的风险。
2 -分析和预测 * 当 * 这种情况发生 * 一般 * 是困难的。

eqzww0vc

eqzww0vc4#

我认为使用+的串联比使用String.format更易读。
String.format在需要格式化数字和日期时很好。

lo8azlld

lo8azlld5#

结合plus,编译器可以对代码进行性能化的转换。字符串格式我不知道。
我更喜欢用加号连接,我觉得这样更容易理解。

inn6fuwd

inn6fuwd6#

保持简单的关键是永远不要看它。我的意思是:

Joiner join = Joiner.on(" ");

public void constructMessage(StringBuilder sb, Iterable<String> words) {
  join.appendTo(sb, words);
}

字符串
我使用GuavaJoiner类来使可读性成为一个非问题。还有什么比“加入”更清楚的呢?所有关于连接的讨厌的比特都被很好地隐藏起来。通过使用Iterable,我可以将此方法用于各种数据结构,列表是最明显的。
下面是一个使用Guava ImmutableList的调用示例(它比常规列表更有效,因为任何修改列表的方法都会抛出异常,并且正确地表示了constructMessage()不能更改单词列表的事实,只是消费它):

StringBuilder outputMessage = new StringBuilder();
constructMessage(outputMessage, 
         new ImmutableList.Builder<String>()
            .add("You", verb, "to", user, "\"", text, "\"")
            .build());

2lpgd968

2lpgd9687#

老实说,如果你想减少输入,我建议你选择第一个,如果你想寻找一种更C风格的方式,我建议你选择第二个。
我在这里坐了一两分钟,思考什么可能是一个问题,但我认为这归结于你想输入多少。
还有人有主意吗

46scxncf

46scxncf8#

假设您要经常重用基本字符串,请将模板存储为
字符串mystring =“您$1到$2 "$3"”
然后只需得到一个副本,并用你想要的替换$X。
这对于资源文件来说也很好用。

相关问题