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)
- Разница между StringBuffer и StringBuilder?
•
StringBuffer
является потокобезопасным благодаря синхронизации методов.•
StringBuilder
не потокобезопасный, что делает его быстрее при использовании в однопоточной среде.
- Где в Java хранятся строки?
В Java строки хранятся в строковом пуле (String Pool), который является частью Heap памяти. Строки, объявленные как литералы, автоматически попадают в этот пул, что позволяет экономить память за счет повторного использования одинаковых строковых объектов.
- Как в Java хранятся строки с одинаковыми значениями?
Строки кэшируются в специальной области памяти, называемой «строковым пулом» (string pool), чтобы минимизировать создание дубликатов и экономить память.