![](/img/trans.png)
[英]Which one is having better performance for Xml String Creation, Jaxb or StringBuffer?
[英]Using String or StringBuffer in Java: which is better?
我阅读了很多关于使用StringBuffer和String的内容,特别是在Java中涉及串联以及是否是线程安全的情况下。
那么,在各种Java方法中应该使用哪些?
例如,在PreparedStatement中,应查询为StringBuffer:
String query = ("SELECT * " +
"FROM User " +
"WHERE userName = ?;");
try {
ps = connection.prepareStatement(query);
然后,在一个String实用程序方法中,例如:
public static String prefixApostrophesWithBackslash(String stringIn) {
String stringOut = stringIn.replaceAll("'", "\\\\'");
return stringOut;
}
和:
// Removes a char from a String.
public static String removeChar(String stringIn, char c) {
String stringOut = ("");
for (int i = 0; i < stringIn.length(); i++) {
if (stringIn.charAt(i) != c) {
stringOut += stringIn.charAt(i);
}
}
return stringOut;
}
我应该使用StringBuffers吗? 特别是在repalceAll无法用于此类对象的情况下。
谢谢
摩根先生。
感谢所有的建议。 StringBuffers已被StringBuilders取代,并且Stringings被StringBuilders取代,我认为它最好。
你几乎不需要使用StringBuffer
。
而不是StringBuffer
你可能意味着StringBuilder
。 StringBuffer类似于StringBuilder,除了它还提供线程安全性。 在实践中很少需要这种线程安全性,只会导致代码运行得更慢。
您的问题似乎不是关于String vs StringBuffer,而是关于使用内置方法或自己实现代码。 如果有一个内置方法完全符合您的要求,您应该使用它。 它可能比您编写的代码更好地优化。
没有简单的答案(除了重复StringBuilder
与StringBuffer
的咒语......)。 为了选择最有效的解决方案,你真的了解了“引擎盖下”的内容。
在您的第一个示例中, String
是要走的路。 对于由一系列String连接组成的任何表达式,Java编译器可以生成非常优化的代码(如果需要,可以使用StringBuilder
)。 并且,如果连接的字符串都是常量或文字,则编译器实际上可以在编译时进行连接。
在你的第二个例子中,不完全清楚String
或StringBuilder
是否更好......或者它们是否大致相同。 人们需要查看java.util.regex.Matcher
类的代码来解决这个问题。
编辑 - 我查看了代码,实际上,使用String或StringBuilder作为源代码没什么区别。 在内部, Matcher.replaceAll
方法创建一个新的StringBuilder,并通过附加源String和替换String中的块来填充它。
在第三个例子中, StringBuilder
显然是最好的。 当前一代Java编译器无法优化代码(如编写的那样),以避免在添加每个字符时创建新的String。
对于以下代码段
// Removes a char from a String.
public static String removeChar(String stringIn, char c) {
String stringOut = ("");
for (int i = 0; i < stringIn.length(); i++) {
if (stringIn.charAt(i) != c) {
stringOut += stringIn.charAt(i);
}
}
return stringOut;
}
你可以做stringIn.replaceAll(c+"","")
即使在MT代码中,让多个线程将字符串附加到字符串也是不寻常的。 StringBuilder几乎总是首选StringBuffer。
现代编译器已经优化了代码。 所以一些String添加将被优化以使用StringBuilder,如果我们认为我们可以保留String添加,它增加了可读性。
例1:
String query = ("SELECT * " +
"FROM User " +
"WHERE userName = ?;");
将优化为像:
StringBuiler sb = new StringBuilder();
sb.append("SELECT * ");
sb.append("FROM User ");
sb.append("WHERE userName = ?;");
String query = sb.toString();
例2:
String numbers = "";
for (int i = 0;i < 20; i++)
numbers = numbers + i;
这无法优化,我们应该在代码中使用StringBuilder。
我为SUN jdk1.5 +做了这个观察。 因此,对于较旧的Java版本或不同的jdks,它可能会有所不同。 可以保存为始终编码StringBuilder(或jbk 1.4.2及更早版本的StringBuffer)。
对于可以被认为是单线程的情况,最好的是StringBuilder 。 它不会添加任何同步开销,而StringBuffer会增加。
只有当你懒惰地使用StringBuilder或者只是想让代码易于阅读并且从性能的角度来看它是可接受的时,'+'运算符的字符串连接才是“好的”,就像启动日志消息“LOG.info(”启动“+ app_name”的实例“+ inst_id +”;“
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.