Если бы вы повторно использовали одну и ту же строку для возврата подстрок, что произойдет, если основная строка выйдет из области видимости?
В лучшем случае он должен оставаться в памяти и не может быть собран до тех пор, пока не будут освобождены все подстроки, так что в итоге вы будете использовать фактически больше памяти.
Это только одна из проблем.
По сути, сборщик мусора будет иметь несколько вариантов:
сохранить всю исходную строку в памяти, даже если ее можно использовать только очень короткой подстрокой.
Освободить части исходной строки, на которые нет ссылок, и сохранить только подстроку там, где она есть. Это создаст большую фрагментацию, а это означает, что сборщику мусора, вероятно, придется в какой-то момент переместить строки: в конечном итоге мы все равно сделаем копию.
Я уверен, что он имеет свои варианты использования, и он может иногда быть более эффективным при работе с подстроками (скажем, при работе с большими документами XML).
Однако, как сказал Джон, объектам Java-строк требуется больше места, поэтому, если у вас много маленьких строк, они могут фактически использовать больше памяти, чем .Net.
Это компромисс.
Я думаю, что если вы находитесь в ситуации, когда действительно важно, как управляется память, и вам нужно иметь абсолютно предсказуемое поведение, ни Java, ни .Net не будут лучшими инструментами.
Мы используем сборщики мусора, потому что они оптимизированы для эффективной работы в подавляющем большинстве случаев.
Важно знать, как они работают, но независимо от того, используют ли они строки повторно или нет, это скорее оптимизация, оставленная базовой структуре, и она не должна слишком сильно просачиваться на поверхность.
В конце концов, ГК здесь, чтобы помочь нам.