Java Строки являются неизменяемыми; это означает, что объединение (также просто добавление одного символа в конец строки) требует создания новой строки, которая состоит из комбинации из содержимого старой строки и содержимого добавленной строки.
Поскольку для этого потребуется скопировать содержимое, время создания новой объединенной строки зависит от тома, который необходимо скопировать.
В качестве примера - реализация String.concat()
из Java 7:
public String concat( String str )
{
int otherLen = str.length();
if( otherLen == 0 )
{
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf( value, len + otherLen ); // *1
str.getChars( buf, len ); // *2
return new String( buf, true ); // *3
}
Конечно, не самый интуитивно понятный, но показывает, как исходная строка копируется в новый буфер (* 1), а затем добавленная строка копируется в этот буфер в ( * 2) до создания новой строки (* 3).
Реализации из более поздних версий Java выглядят по-разному, но в основном они будут делать то же самое.