BD *_*ill 15 java string string-formatting
我听说使用StringBuilder比使用字符串连接更快,但我厌倦了一直在与StringBuilder对象进行摔跤.我最近接触过SLF4J日志库,与String.format相比,我喜欢格式化的"正确做事".那里有一个图书馆可以让我写下这样的东西:
int myInteger = 42;
MyObject myObject = new MyObject(); // Overrides toString()
String result = CoolFormatingLibrary.format("Simple way to format {} and {}",
myInteger, myObject);
Run Code Online (Sandbox Code Playgroud)
另外,是否有任何原因(包括性能但不包括对日期和重要数字格式的细粒度控制)为什么我可能想要在这样的库中使用String.format(如果它存在的话)?
Ami*_*iri 23
虽然接受的答案是好的,如果(像我一样)一个人对Slf4J风格的语义感兴趣,那么正确的解决方案是使用Slf4J的MessageFormatter
以下是一个示例用法代码段:
public static String format(String format, Object... params) {
return MessageFormatter.arrayFormat(format, params).getMessage();
}
Run Code Online (Sandbox Code Playgroud)
(注意,此示例丢弃了类型的最后一个参数Throwable)
对于连接字符串一次,老可靠"str" + param + "other str"是完全没有问题(它实际上是由编译器转换成StringBuilder).
如果你必须继续向字符串添加内容,StringBuilders主要是有用的,但你不能将它们全部放入一个语句中.例如,采用for循环:
String str = "";
for (int i = 0; i < 1000000; i++) {
str += i + " "; // ignoring the last-iteration problem
}
Run Code Online (Sandbox Code Playgroud)
这将比等效的StringBuilder版本运行得慢得多:
StringBuilder sb = new StringBuilder(); // for extra speed, define the size
for (int i = 0; i < 1000000; i++) {
sb.append(i).append(" ");
}
String str = sb.toString();
Run Code Online (Sandbox Code Playgroud)
但这两个在功能上是等价的:
String str = var1 + " " + var2;
String str2 = new StringBuilder().append(var1).append(" ").append(var2).toString();
Run Code Online (Sandbox Code Playgroud)
退房java.text.MessageFormat.来自Javadocs的示例代码:
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {new Long(fileCount), diskName};
MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0} file(s).");
System.out.println(form.format(testArgs));
Run Code Online (Sandbox Code Playgroud)
输出:
The disk "MyDisk" contains 1,273 file(s).
还有一种静态format方法,不需要创建MessageFormat对象.
所有这些库都将归结为最基本级别的字符串连接,因此彼此之间的性能差异不会很大.
| 归档时间: |
|
| 查看次数: |
3620 次 |
| 最近记录: |