Sobes.tech
Junior
195

Wat is het verschil tussen het maken van een string met dubbele aanhalingstekens en het aanroepen van de constructor new String?

Antwoord van AI

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 (содержимое одинаковое)