Назад к вопросам
Junior
83
questionbank
В чем разница между созданием строки с помощью двойных кавычек и вызовом конструктора new String?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
При создании строки с использованием двойных кавычек ("строка") JVM ищет в пуле строк (String Pool) строку с таким же содержимым. Если такая строка найдена, возвращается ссылка на существующий объект. Если нет, создается новый объект строки в пуле строк, и возвращается ссылка на него. Это оптимизирует использование памяти, так как одинаковые строковые литералы ссылаются на один и тот же объект.
При создании строки с использованием конструктора new String("строка") всегда создается новый объект строки вне пула строк, даже если в пуле строк уже есть строка с таким же содержимым.
Различия:
- Пул строк: Двойные кавычки используют пул строк,
new String- нет. - Производительность: Использование двойных кавычек обычно быстрее из-за возможности переиспользовать существующие объекты.
- Количество объектов: Двойные кавычки могут привести к меньшему количеству строковых объектов в памяти по сравнению с многократным использованием
new Stringс одинаковым содержимым. - Сравнение:
- При сравнении строк, созданных двойными кавычками с одинаковым содержимым, оператор
==вернетtrue, так как они ссылаются на один и тот же объект. - При сравнении строк, созданных с помощью
new String(даже с одинаковым содержимым) или строки, созданной двойными кавычками, со строкой, созданнойnew String, оператор==вернетfalse, так как это разные объекты. Для сравнения содержимого строк всегда следует использовать методequals().
- При сравнении строк, созданных двойными кавычками с одинаковым содержимым, оператор
Пример:
// Создается в пуле строк (или переиспользуется)
String s1 = "abc";
// Создается в пуле строк (переиспользует объект "abc" из пула)
String s2 = "abc";
// Создается новый объект вне пула строк
String s3 = new String("abc");
// Создается новый объект вне пула строк
String s4 = new String("abc");
// s1 == s2 -> true (ссылаются на один и тот же объект в пуле)
// s1 == s3 -> false (разные объекты)
// s3 == s4 -> false (разные объекты)
// s1.equals(s2) -> true (содержимое одинаковое)
// s1.equals(s3) -> true (содержимое одинаковое)
// s3.equals(s4) -> true (содержимое одинаковое)