0

我知道 StrinbBuilder 很好用,用于连接两个字符串对象。我想知道这样做时发生了什么:

"a" + i + "b";

哪个选项最快、最安全:

1.

int i = 0;
String a = "a" + i + "b";

2.

int i = 0;
String a = "a".concat(String.valueOf(i)).concat("b");

3.

int i = 0;
String a = String.format("a%db", i);
4

3 回答 3

0

因为字符串在java中是不可变的,所以每次当你执行一个产生新字符串对象的字符串操作时,如果应该考虑内存,你不能使用带有“+”号的字符串连接,因为它会创建多个字符串对象并且不能保证清理当垃圾收集器运行时你不知道,你还应该考虑操作应该是线程安全的,所以在使用 stringbuffer 和 stringbuilder 时要小心

于 2013-10-27T06:11:19.370 回答
0

它们都不是字符串连接的最佳选择。一定要使用 StringBuilder,但要正确使用它,不要每次都丢弃它:

StringBuilder a = new StringBuilder("a");
for(int i = 0;i<10;i++){
    a.append("b");
}

这将执行此操作,而无需每次都创建新的 String 对象。

于 2013-10-26T14:49:02.083 回答
0

它们都不是真的很好 - 你仍然StringBuilder在幕后创建一个并在之后丢弃它。这里有另外两个选项:

  • 创建StringBuilder显式和循环。

    StringBuilder builder = new StringBuilder("a");
    for(int i = 0; i < 10; i++) {
        a.append("b");
    }
    String a = builder.toString();
    
  • 使用 Guava 的Strings.repeat()方法,并将结果连接到StringBuilder.

    String a = new StringBuilder("a").append(Strings.repeat("b", 9).toString();
    

在性能方面,确实没有太多需要改进的地方——在某种程度上,你正在创建n 个字符串。我们唯一可以实际改进的是内存开销。

于 2013-10-26T14:55:05.253 回答