繁体   English   中英

在Java中使用String或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,而是关于使用内置方法或自己实现代码。 如果有一个内置方法完全符合您的要求,您应该使用它。 它可能比您编写的代码更好地优化。

没有简单的答案(除了重复StringBuilderStringBuffer的咒语......)。 为了选择最有效的解决方案,你真的了解了“引擎盖下”的内容。

在您的第一个示例中, String是要走的路。 对于由一系列String连接组成的任何表达式,Java编译器可以生成非常优化的代码(如果需要,可以使用StringBuilder )。 并且,如果连接的字符串都是常量或文字,则编译器实际上可以在编译时进行连接。

在你的第二个例子中,不完全清楚StringStringBuilder是否更好......或者它们是否大致相同。 人们需要查看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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM