Соединение двух строк

Я знаю, что 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);

person user2618929    schedule 26.10.2013    source источник
comment
[код] — плохой ход, потому что объект StringBuilder создается 10 раз. Объекты StringBuilder не создаются. StringBuilders - это то, что вам нужно.   -  person nanofarad    schedule 26.10.2013
comment
Ни одна из альтернатив не делает того, что делает исходный код...   -  person NPE    schedule 26.10.2013
comment
Извините, вы не поняли вопроса, речь шла вовсе не о циклическом коде. Я удалил это сейчас.   -  person user2618929    schedule 26.10.2013
comment
Помогает ли это: - stackoverflow.com/questions/5076740/?   -  person Rahul Tripathi    schedule 26.10.2013
comment
Что значит Безопаснее? Ни один из представленных вариантов не несет никакого риска.   -  person weston    schedule 26.10.2013
comment
Поскольку циклы не обсуждаются: вариант 1 является самым быстрым и безопасным, поскольку он будет скомпилирован в выражение StringBuilder.   -  person Louis Wasserman    schedule 26.10.2013


Ответы (3)


Ни один из них не является оптимальным для конкатенации строк. Используйте StringBuilder, но используйте его правильно, не отбрасывая его каждый раз:

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

Это будет выполнять это без создания новых объектов String каждый раз.

person nanofarad    schedule 26.10.2013
comment
Да, я знаю об этом, но вопрос был не в этом. Я просто спрашивал о подключении строк во время создания первой строки. Как это сделать быстрее всего: String a = a + i + b; - person user2618929; 26.10.2013
comment
+ операция на самом деле такая же. поэтому мб + предпочтительнее, потому что он короче. - person DaunnC; 26.10.2013

Ни один из них не является действительно хорошим - вы все еще создаете StringBuilder под прикрытием и сразу же отбрасываете его. Вот еще два варианта:

  • Создайте StringBuilder явно и выполните цикл.

    StringBuilder builder = new StringBuilder("a");
    for(int i = 0; i < 10; i++) {
        a.append("b");
    }
    String a = builder.toString();
    
  • Используйте Strings.repeat() и соедините результат с StringBuilder.

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

С точки зрения производительности, на самом деле особо нечего улучшать — на каком-то уровне вы создаете n строк. Единственное, что мы могли бы реально улучшить, — это накладные расходы памяти.

person Makoto    schedule 26.10.2013

поскольку строки неизменяемы в java, поэтому каждый раз, когда вы выполняете строковую операцию, которая приводит к новому строковому объекту, если следует учитывать память, вы не должны использовать конкатенацию строк со знаком «+», так как это создаст несколько строковых объектов, и очистка не гарантируется так как при запуске сборщика мусора вы не знаете, вы также должны учитывать, что операции должны быть потокобезопасными, поэтому будьте осторожны при использовании stringbuffer и stringbuilder

person Muhammad Ahmed    schedule 27.10.2013