有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java这会使StringBuilder的使用变得多余吗?

如果我这样做:

StringBuilder sb = new StringBuilder();
sb.append("somestring" + "hello" + "more strings" + "last one");

这与:

string s = "somestring";
s + "hello" + "more strings" + "last one";

使用字符串生成器会变得毫无意义吗?因此需要使用:

StringBuilder sb = new StringBuilder();
sb.append("somestring");
sb.append("hello");
sb.append("more strings");
sb.append("last one");

共 (6) 个答案

  1. # 1 楼答案

    在多次追加元素时,应该使用StringBuilderStringBuffer而不是字符串“+”操作。例如:

    String s = new String();
    for(int i=0; i < x; i++){
      s += i;
    }
    

    因为这将被转换成(类似的东西):

    String s = new String();
    for(int i=0; i < x; i++){
       StringBuffer sb = new StringBuffer();
       sb.append(s);
       sb.append(i)
       s = sb.toString();
    }
    

    在每次迭代中(在字节码等价物中),您将创建一个StringBuffer,并将其转换为一个String

    有很多来源,但是:thisthis都可以。我在2010年左右做了一个关于这个问题的小研究,我对这个问题的了解可以追溯到那时。如果从那时起有其他改进,我不知道

  2. # 2 楼答案

    你的长问题的简短回答是“是”

  3. # 3 楼答案

    StringBuilder是可变的,但String不是。 StringBuilder使这些字符串操作更加高效。 对于像你的例子这样的小作品,你可能不会注意到它们之间的区别

  4. # 4 楼答案

    查看使用StringBuilder的代码与简单连接字符串的代码的编译输出,我发现最新的编译器通常会使用StringBuilder,无论何时合适。话虽如此,请注意,在第一个示例中,您需要说's=s+“hello”;为了抓住结果

  5. # 5 楼答案

    如果这是你在那段代码中对StringBuilder的使用,那么它确实是毫无意义的。如果在初始调用append之后继续追加,那么它并不是完全没有意义的。不过,你的最后一个例子比前两个更有意义

    我假设你帖子中的常量只是为了清楚起见。如果它们确实是常量,编译器将执行constant folding,使第一个示例相当于

    StringBuilder sb = new StringBuilder();
    sb.append("somestringhello");
    
  6. # 6 楼答案

    在第一种情况下,编译器将检测固定文本,并将其作为单个值内联。就像

    sb.append("somestring" + "hello" + "more strings" + "last one");
    

    将被视为

    sb.append("somestringhellomore stringslast one");
    

    因此,它只会向StringBuilder追加一次


    在第二种情况下,它会附加多次