Strings

String

Последовательность символов. Все строковые классы — final (от них нельзя унаследоваться). String - immutable final class - созданный объект класса String не может быть изменен.

String name = "Bob";
StringBuffer

Строки являются неизменными поэтому частая их модификация приводит к созданию новых объектов, что в свою очередь расходует память. Для решения этой проблемы был создан класс StringBuffer который позволяет более эффективно работать над модификацией строки. Класс является mutable то есть изменяемым — используйте его, если хотите изменять содержимое строки. StringBuffer может быть использован в многопоточных средах так как все необходимые методы являются синхронизированными.

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abc").append("def");
StringBuilder

StringBuilder — класс что представляет изменяемую последовательность символов. Класс был введен в Java 5 и имеет полностью идентичный API с StringBuffer. Единственное отличие — StringBuilder не синхронизирован. Это означает, что его использование в многопоточных средах нежелательно. Следовательно, если вы работаете с многопоточностью идеально подходит StringBuffer иначе используйте StringBuilder который работает намного быстрее в большинстве реализаций.

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abc").append("def");
new

Когда строка создается с использованием ключевого слова new, создается новый объект в куче (heap), даже если строка с таким же значением уже существует в пуле строк. Это означает, что объект в куче и объект в строковом пуле не будут ссылаться на один и тот же объект.

String s3 = new String("hello");  // Создаст новый объект в heap
intern

Используется чтобы поместить строку в пул строк или вернуть ссылку на уже существующую строку в пуле. Если строка не найдена в пуле, она добавляется туда, и возвращается ссылка на этот объект.

String s3 = new String("hello");
String s4 = s3.intern();  // Вернёт ссылку на строку из String Pool
String Pool

Механизм, который позволяет оптимизировать работу с объектами строк, сохраняя их в специальной области памяти, называемой heap. Позволяет уменьшить потребление памяти и улучшить производительность, кэшируя строки и избегая дублирования. Строки в Java неизменяемы (immutable). Это означает, что как только строка создана, её содержимое не может быть изменено. Благодаря этому их можно безопасно кэшировать в пуле.

// Когда строка создается с использованием литералов, например, String s1 = "hello";, JVM проверяет пул на наличие строки "hello".
// Если такая строка уже существует в пуле, переменная s1 будет ссылаться на уже существующий объект. Если нет — строка добавляется в пул.

String s1 = "hello";
String s2 = "hello";  // Будет ссылаться на тот же объект в String Pool
Вопросы на собесе (3)
  1. Разница между StringBuffer и StringBuilder?

    StringBuffer является потокобезопасным благодаря синхронизации методов.

    StringBuilder не потокобезопасный, что делает его быстрее при использовании в однопоточной среде.

  1. Где в Java хранятся строки?

    В Java строки хранятся в строковом пуле (String Pool), который является частью Heap памяти. Строки, объявленные как литералы, автоматически попадают в этот пул, что позволяет экономить память за счет повторного использования одинаковых строковых объектов.

  1. Как в Java хранятся строки с одинаковыми значениями?

    Строки кэшируются в специальной области памяти, называемой «строковым пулом» (string pool), чтобы минимизировать создание дубликатов и экономить память.