На самом деле они оба примерно одинаковы при работе со строками.
Проще говоря, строки неизменяемы.Таким образом, если у вас есть строка из 1000 символов, и вы добавляете к ней 1000 символов, то у вас есть одна строка из 2000 символов, а предыдущая доступна для сборки мусора.
Если у вас есть строка в 1 млн.и измените его, у вас есть новая строка 1M, а старая доступна для сборки мусора.Поскольку строки являются неизменяемыми, нет никакой уловки разделения старой строки, удаления того, что вы хотите, добавления новой и добавления старого и нового вместе.Скорее, он просто копирует его оптом с новой версией.
Существуют другие структуры, которые ведут себя лучше, но все еще имеют схожие проблемы.
Например, если у вас есть StringBuilder, он будет себя вестипочти так же, как обычная строка в случае 1000 + 1000.Однако, если вы знаете, что это произойдет, вы можете предварительно выделить его, скажем, 10 000, а затем он просто скопирует в заранее выделенное пространство, а не выбросит весь старый комплект.
Еще одна особенность неизменяемости строк - возможность совместного использования строк.
Простой пример:
String a = "abc123";
String b = a.substring(1, 3);
Это будет один массив из 6 символов ("abc123"), но ОБАСтрока будет указывать на этот массив, строка 'b' будет указывать на смещение в массиве от оригинала.
Недостатком этого является:
String a = ".../pinky 1 MILLION characters...";
String b = a.substr(1, 3);
a = null;
'b' теперь указываетв исходный буфер, который использовал «a», хотя он «видит» только 3 символа.Итак, ваша строка 'b' на самом деле удерживает 1 млн символов памяти.