Is there a way to build a Java String using an SLF4J-style formatting function?

后端 未结 3 1577
既然无缘
既然无缘 2021-02-07 03:39

I\'ve heard that using StringBuilder is faster than using string concatenation, but I\'m tired of wrestling with StringBuilder objects all of the time. I was recently exposed t

3条回答
  •  情话喂你
    2021-02-07 04:16

    For concatenating strings one time, the old reliable "str" + param + "other str" is perfectly fine (it's actually converted by the compiler into a StringBuilder).

    StringBuilders are mainly useful if you have to keep adding things to the string, but you can't get them all into one statement. For example, take a for loop:

    String str = "";
    for (int i = 0; i < 1000000; i++) {
        str += i + " "; // ignoring the last-iteration problem
    }
    

    This will run much slower than the equivalent StringBuilder version:

    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();
    

    But these two are functionally equivalent:

    String str = var1 + " " + var2;
    String str2 = new StringBuilder().append(var1).append(" ").append(var2).toString();
    

    Having said all that, my actual answer is:

    Check out java.text.MessageFormat. Sample code from the 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));
    

    Output:

    The disk "MyDisk" contains 1,273 file(s).

    There is also a static format method which does not require creating a MessageFormat object.

    All such libraries will boil down to string concatenation at their most basic level, so there won't be much performance difference from one to another.

提交回复
热议问题