如果字符串是使用单个串联表达式构建的;例如:
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,它将字节码中的构造函数和方法调用序列替换为单个字节码。然后,运行时系统将优化此1。invokedynamic
当您开始创建中间字符串或使用等构建字符串时,效率问题会出现。此时,将变得更加高效,因为您可以减少创建然后丢弃的中间字符串的数量。+=
StringBuilder
现在当你使用时,它应该使用引擎盖下。但是,每次进行调用时还必须解析 String 格式,如果以最佳方式构建字符串,则不会有开销。String.format()
StringBuilder
format
话虽如此,我的建议是以最易读的方式编写代码。只有当分析告诉您这是一个真正的性能问题时,才担心构建字符串的最有效方法。(现在,您正在花时间思考如何解决可能无关紧要或无关紧要的性能问题。
另一个答案提到,使用格式字符串可以简化对多种语言的支持。这是真的,尽管在复数,性别等事情上你可以做什么是有限的。
1 - 因此,对于 Java 9 或更高版本,上述示例的手牌优化实际上可能会产生负面影响。但这是您在微优化时要承担的风险。