В чем разница между объектом класса String и кастомным объектом в Java?

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

Ответ

String — это встроенный, специально оптимизированный и неизменяемый (immutable) класс в Java для работы с последовательностями символов.

Кастомный объект — это экземпляр любого класса, созданного разработчиком, поведение которого (изменяемость, сравнение) определяется в коде.

Основные различия:

  1. Иммутабельность: Объекты String неизменяемы. Любая операция, изменяющая строку, возвращает новый объект. Кастомный объект по умолчанию изменяем (mutable), если не реализован как immutable.
  2. Пул строк (String Pool): String использует механизм кэширования литералов для экономии памяти. Для кастомных объектов такого пула по умолчанию нет.
  3. Сравнение: Для String всегда следует использовать equals() для сравнения содержимого. Оператор == сравнивает ссылки, что из-за пула строк может давать неочевидные результаты. Для кастомных объектов equals() и hashCode() нужно переопределять явно.
  4. Встроенная функциональность: String имеет богатый API (substring(), matches(), format() и т.д.). Для кастомного класса все методы определяются разработчиком.

Пример:

// String - неизменяемый
String str = "Hello";
str.toUpperCase(); // Возвращает НОВЫЙ объект "HELLO", исходный `str` не изменился

// Кастомный объект - может быть изменяемым
class Person {
    private String name;
    public void setName(String name) { this.name = name; } // Мутатор
}
Person person = new Person("Alice");
person.setName("Bob"); // Состояние объекта изменено