Java字符串连接 - 有更好的方法吗?

时间:2013-03-21 10:40:45

标签: java string concatenation

只是一个快速形式的问题。在下面的代码中,是否有更好的方法来连接字符串(即我可以将tmpError设置为等于新字符串而不是添加它?)

public void validate () throws Exception {
    String tmpError = "";
    if(paramA == null) tmpError = tmpError + "paramA was not set";

    if(paramB == null) tmpError = tmpError + "paramB was not set";

    if(paramC == null) tmpError = tmpError + "paramC was not set";


    if(!tmpError.equalsIgnoreCase("")){
        tmpError = "error occured" + tmpError;
        throw new Exception(tmpError);
    }
}

提前致谢

8 个答案:

答案 0 :(得分:4)

使用StringBuilder可以轻松提高效率。

由于String的不可变性,每次使用加法(+)运算符进行字符串连接时,都会分配一个新的String对象(使用时也会这样做{ {1}})。

String.concat()保留一个内部字符数组,以便连接操作在该数组上工作,并且在调用其StringBuilder方法时只分配一个String对象。使用其toString()方法将文本附加到字符串的末尾,并使用带有偏移量0的append()来添加文本。

但是,您还应该考虑可读性。 Dasblinkenlight在他的answer中提出了一个很好的观点。正如Anthony已经指出的那样,你也可以使用insert()复合赋值运算符来增强可读性。

+=

答案 1 :(得分:4)

我总是建议使用StringBuilder

类似的东西:

public void validate() throws Exception {
    StringBuilder error = new StringBuilder();
    if(paramA == null)
        error.append("paramA was not set");

    if(paramB == null)
        error.append("paramB was not set");

    if(paramC == null)
        error.append("paramC was not set");


    if(error.length() > 0) {

        throw new Exception("error occured " + error.toString());
    }
}

答案 2 :(得分:1)

您可以使用+=(添加/连接和分配)运算符:

if(paramA == null) tmpError += "paramA was not set";

答案 3 :(得分:1)

这效率不高,因为缺少所有三个参数,您将创建四个字符串对象。最好不要附加到单个StringBuilder对象。

但是,这是错误报告代码,只有在代码检测到编程错误时才会执行该代码。在这种情况下,效率并不重要,因为它们不应该首先发生。使用您认为更容易理解的任何内容。

答案 4 :(得分:1)

这样做:

public void validate () throws Exception {
    String tmpError = "";
    if(paramA == null) tmpError += "paramA was not set";

    if(paramB == null) tmpError += "paramB was not set";

    if(paramC == null) tmpError += "paramC was not set";


    if(!tmpError.equalsIgnoreCase("")){
        tmpError = "error occured" + tmpError;
        throw new Exception(tmpError);
    }
}

或者,您可以使用Xavi指出的StringBuilder,但对我来说,只有在某种循环中附加文本时才有意义。

答案 5 :(得分:1)

连接两个字符串的最快方法是String类的concat函数。

public void validate () throws Exception {
    String tmpError = "";

    if(paramA == null) tmpError = tmpError.concat("paramA was not set");
    if(paramB == null) tmpError = tmpError.concat("paramB was not set");
    if(paramC == null) tmpError = tmpError.concat("paramC was not set");
    if(!tmpError.equalsIgnoreCase("")){
        tmpError = "error occured".concat(tmpError);
        throw new Exception(tmpError);
    }
}

答案 6 :(得分:1)

您可能希望使用Guava Preconditions,而不是上述任何一项。然后你可以写这样的代码:

import static com.google.common.base.Preconditions.*;
...
public void doSomething(String strA, String strB) {
  checkNotNull(strA, "strA is missing");
  checkArgument(strB.length() >= 6, "strB is too short");
  ...
}

如果检查失败,则抛出Exception。它可能不像你原来的解决方案那么简洁,但你的意图在语义上是显而易见的。

答案 7 :(得分:0)

我会做如下的事情 public void validate()抛出异常{

public void validate () throws Exception {
    String tmpError = "";
    if(paramA == null) tmpError += "paramA was not set";
    if(paramB == null) tmpError += "paramB was not set";
    if(paramC == null) tmpError += "paramC was not set";

    if(!(tmpError.trim()).equalsIgnoreCase("")){
        tmpError = "error occured" + tmpError;
        throw new Exception(tmpError);
    }
}

请参阅我已使用+=并修剪tmpError变量,然后再将其检查为空。

我不认为你不需要担心StringBuilder,因为在这种情况下没有多少内存被处理。

如果您坚持使用StringBuilder,那么您可以执行以下操作

public void validate () throws Exception {
    StringBuilder sb = new StringBuilder();
    if(paramA == null) sb.append("paramA was not set");
    if(paramB == null) sb.append("paramB was not set");
    if(paramC == null) sb.append("paramC was not set");

    if(!(sb.toString().trim()).equalsIgnoreCase("")){
        sb.Insert(0,"error occured");
        throw new Exception(sp.toString());
    }
}