Junior
88
questionbank
В чем разница между созданием строки с помощью new String() и использованием литерала строки?
Ответ от нейросети
sobes.tech AI
При использовании литерала строки ("abc") строка создается в пуле строк (String Pool). Если строка с таким же значением уже существует в пуле, возвращается ссылка на существующий объект. Это оптимизация для экономии памяти.
При использовании new String("abc") всегда создается новый объект строки в куче (heap), даже если строка с таким же значением уже есть в пуле строк.
Пример:
// Создается литерал строки "hello". Если такой строки нет в пуле, она добавляется.
// str1 ссылается на объект в пуле.
String str1 = "hello";
// Снова используется литерал "hello". Поскольку он уже есть в пуле,
// str2 также ссылается на тот же объект в пуле, что и str1.
String str2 = "hello";
// Создается новый объект строки со значением "hello" в куче.
// str3 ссылается на этот новый объект в куче, а не на объект в пуле.
String str3 = new String("hello");
// Проверка ссылок:
// str1 и str2 ссылаются на один и тот же объект в пуле.
System.out.println(str1 == str2); // true
// str1 ссылается на объект в пуле, str3 на новый объект в куче.
System.out.println(str1 == str3); // false
// Проверка значения:
// Все строки имеют одинаковое значение.
System.out.println(str1.equals(str3)); // true
Различия в таблице:
| Критерий | Литерал строки ("abc") |
new String("abc") |
|---|---|---|
| Место создания | Пул строк (String Pool) | Куча (Heap) |
| Создание объекта | Возвращает существующий или создает новый | Всегда создает новый объект |
| Оптимизация памяти | Эффективно использует пул для повторений | Может создавать дубликаты, менее эффективно |
Сравнение ссылок (==) |
Часто true для строк с одинаковым значением |
Всегда false для строк с одинаковым значением, созданных отдельно |