Ответ
Строка (java.lang.String) — это неизменяемый (immutable) объект, представляющий последовательность символов Unicode. Это один из самых часто используемых классов в Java.
Главная особенность: Неизменяемость (Immutability)
- Любая операция, модифицирующая строку (
concat(),replace(),toLowerCase()), возвращает новый объектString. - Исходная строка остается неизменной.
- Преимущества: Безопасность в многопоточности, возможность кэширования хэш-кода, использование в качестве ключей в
HashMap.
Создание строк:
// 1. Литерал (попадает в String Pool)
String s1 = "Hello";
// 2. Через конструктор (создается новый объект в куче)
String s2 = new String("Hello");
// 3. Из массива символов
char[] chars = {'H', 'i'};
String s3 = new String(chars);
String Pool («пул строк»):
- Специальная область в heap memory (куче) для хранения уникальных строковых литералов.
- При создании через литерал (
"text") JVM сначала ищет строку в пуле. Если находит — возвращает ссылку на существующий объект, если нет — создает новый в пуле. - Интернирование: Метод
intern()помещает строку в пул или возвращает ссылку на уже существующую.String a = "hello"; String b = new String("hello").intern(); System.out.println(a == b); // true (ссылки на один объект в пуле)
Основные методы:
String str = " Java "
// Длина и символы
int len = str.length(); // 6
char ch = str.charAt(1); // 'J'
// Модификация (создает новые строки)
String trimmed = str.trim(); // "Java"
String upper = str.toUpperCase(); // " JAVA "
String concat = str.concat("17"); // " Java 17"
String replaced = str.replace('a', 'o'); // " Jovo "
// Сравнение
boolean eq1 = str.equals(" java "); // false (регистр)
boolean eq2 = str.equalsIgnoreCase(" java "); // true
int cmp = str.compareTo(" Ada "); // положительное число
// Поиск и проверка
boolean starts = str.startsWith(" Ja"); // true
int index = str.indexOf('a'); // 2
boolean contains = str.contains("av"); // true
// Разделение и подстроки
String[] parts = "a,b,c".split(","); // ["a", "b", "c"]
String sub = str.substring(1, 4); // "Jav"
Производительность: Для частых модификаций используйте StringBuilder (небезопасен для потоков) или StringBuffer (потокобезопасный, но медленнее).