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

时间:2011-10-15 02:40:14

标签: java string-formatting string-concatenation mud

我正在使用java编写MUD(基于文本的游戏)。 MUD的一个主要方面是格式化字符串并将其发送回用户。如何最好地完成这项工作?

说我想发送以下字符串:

你对别人说“你好!” - “有人”,“说”和“你好!”都是变数。哪个是最好的表现?

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

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

或其他一些选择?

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

这里有什么建议吗?

8 个答案:

答案 0 :(得分:21)

如果使用单个串联表达式构建字符串; e.g。

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编译器会将前者编译成后者......差不多。)

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

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


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

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

答案 1 :(得分:1)

与plus连接,compilet可以以性能方式转换代码。用字符串格式我不知道。

我更喜欢用plus连接,我认为这更容易让人失望。

答案 2 :(得分:1)

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

Joiner join = Joiner.on(" ");

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

我正在使用Guava Joiner类使可读性成为非问题。什么比“加入”更清楚?关于连接的所有讨厌的部分都被很好地隐藏起来了。通过使用Iterable,我可以将此方法与各种数据结构一起使用,列表最明显。

以下是使用Guava ImmutableList进行调用的示例(比常规列表更有效,因为修改列表的任何方法都会抛出异常,并正确表示constructMessage()无法更改单词列表的事实,只是消耗它):

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

答案 3 :(得分:0)

我会诚实地建议你选择第一个,如果你想减少打字,或者建议你选择后者,如果你正在寻找更多C风格的方式。

我在这里坐了一两分钟,思考可能出现问题的想法,但我认为这取决于你想输入多少。

其他人有想法吗?

答案 4 :(得分:0)

假设您要重复使用基本字符串,请将模板存储为

String mystring =“你$ 1到$ 2 \”$ 3 \“”

然后只需获得一份副本并用你想要的东西替换$ X.

这对资源文件也很有用。

答案 5 :(得分:0)

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

String.format在你需要格式化数字和日期时很好。

答案 6 :(得分:-1)

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

答案 7 :(得分:-2)

性能最好的可能是使用StringBuffer。