Почему не является конструктором String()?

Использует конструктор String(), поскольку строковый литерал полезен в любом сценарии? Использование строковых литералов позволяет повторно использовать существующие объекты, поэтому зачем нам нужен публичный конструктор? Существует ли какое-либо использование в реальном мире? Например, оба литерала указывают на один и тот же объект.

String name1 = "name";//new String("name") creates a new object.
String name2 = "name";

Ответ 1

Один пример, где конструктор имеет полезную цель: Строки, созданные String.substring(), совместно используют базовый char[] из String, который они создаются. Поэтому, если у вас есть String длиной 10.000.000 (занимает 20 Мбайт памяти) и принимает первые 5 символов в качестве подстроки, то отбрасывает исходный String, что подстрока все равно сохранит объект 20 МБ, который будет иметь право на сбор мусора, Использование конструктора String на нем позволит избежать этого, поскольку оно делает копию только части базового массива char, который фактически используется экземпляром String.

Конечно, если вы создаете и используете множество подстрок одного и того же String, особенно если они перекрываются, то вы очень хотите, чтобы они делили базовый char[], и использование конструктора было бы контрпродуктивным.

Ответ 2

Поскольку строка неизменна, операции, подобные подстроке, сохраняют исходную строку, которая может быть длинной. Использование конструктора для создания новой строки из подстроки создаст новую строку и позволит отбросить старую строку (в GC). Этот способ может освободить необходимую память.
Пример:

String longS = "very long";
String shortS = new String(longS.substring(4));

Ответ 3

Потому что иногда вам может понадобиться создать копию, а не просто иметь новую ссылку на ту же строку.

Ответ 4

Все хорошие ответы здесь, но я считаю, что стоит отметить, что Java рассматривает литералы, совершенно отличные от строк, построенных традиционным способом.

Это хороший Q/A об этом.