Ответ
Основная особенность строк в Java — их неизменяемость (immutability). После создания объект String не может быть изменен. Это обеспечивает:
- Безопасность: Строки можно безопасно передавать между потоками.
- Кеширование: JVM использует String Pool для хранения литералов, что экономит память.
- Хеширование: Хеш-код строки вычисляется один раз и кешируется, что полезно для коллекций вроде
HashMap.
Пример, демонстрирующий String Pool и неизменяемость:
String s1 = "hello"; // Литерал — попадает в String Pool.
String s2 = "hello"; // Возвращает ссылку на тот же объект из пула.
String s3 = new String("hello"); // Явное создание нового объекта в куче.
String s4 = s1.toUpperCase(); // Создается НОВЫЙ объект "HELLO".
System.out.println(s1 == s2); // true (одна ссылка из пула).
System.out.println(s1 == s3); // false (разные объекты).
System.out.println(s1.equals(s3)); // true (одинаковое содержимое).
Практические следствия:
- Конкатенация (
+) в циклах создает много промежуточных объектов. Для эффективной сборки строк используйтеStringBuilderилиStringBuffer. - Методы типа
substring(),trim(),replace()возвращают новые строки, не изменяя исходную. - Класс
Stringреализует интерфейсыCharSequence,Comparable<String>,Serializable.