С помощью следующей строки вы не создаете новый объект String
в куче, но повторно используете строковый литерал (если он уже доступен):
String message = "Hai";
"Hai"
- строковый литерал в пуле строковых литералов. Поскольку строки являются неизменяемыми, они могут использоваться повторно, поэтому они объединяются в пул строковых литералов JVM. И это рекомендуемый способ, потому что вы используете его повторно.
Но со следующим вы фактически создаете новый объект (в куче):
String message = new String("Hai");
new String("Hai")
- это новый String
объект. В этом случае, даже если литерал "Hai"
уже был в строковом литеральном пуле, создается новый объект. Это не рекомендуется, поскольку есть вероятность, что у вас может быть более одного String
объектов с одинаковым значением.
Также смотрите этот пост: Вопросы о пуле строк Java
Существуют ли другие классы, которым не требуется новый для создания объекта ??
На самом деле вы не можете создавать объекты в Java без использования ключевого слова new
.
, например
Integer i = 1;
Не означает, что объект Integer
создан без использования new
. Нам просто не нужно явно использовать ключевое слово new
. Но под капотом, если объект Integer
со значением 1 еще не существует в кеше (Integer
объекты кэшируются JVM), для его создания будет использовано ключевое слово new
.