Что такое строка (String) в Java и каковы её основные особенности?

«Что такое строка (String) в Java и каковы её основные особенности?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Строка (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 (потокобезопасный, но медленнее).