Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
== для объектов сравнивает ссылки, а не содержимое. Строковые литералы и константные выражения JVM кладёт в пул строк, поэтому два литерала "jub" указывают на один объект, и == случайно даёт true.
Строка, собранная во время работы, прочитанная из файла или запроса, или созданная через new String, это новый объект. Содержимое то же, ссылка другая.
String a = "jub";
String b = "jub";
String c = new String("jub");
String part = "ju";
String d = part + "b";
a == b; // true: один объект из пула
a == c; // false
a == d; // false: склейка во время работы
a.equals(d); // trueСодержимое сравнивают через equals, без учёта регистра через equalsIgnoreCase. Если строка может быть null, удобно Objects.equals(a, b).
Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Что вернёт "ju" + "b" == "jub"?
Ответ уровня Junior
true: это константное выражение, компилятор склеит его сам, и результат окажется в пуле.
Уточнение 2-го уровня: А если "ju" лежит в переменной?
Ответ уровня Middle
Если переменная final и инициализирована константой, выражение остаётся константным и результат true. Без final склейка идёт во время работы, создаётся новый объект, результат false.
Уточнение 3-го уровня: Зачем нужен intern() и почему им редко пользуются?
Ответ уровня Senior
intern() возвращает каноническую строку из пула. Экономит память на множестве одинаковых строк, но каждый вызов идёт в общую таблицу строк. Чаще хватает дедупликации строк в G1 или своего словаря.
Типичные ошибки
- Сравнивать строки из запроса через == и проверять только на литералах в тесте.
- Вызывать equals у строки, которая может быть null, вместо Objects.equals.
Первоисточники
Быстрые задания по теме
Для темы «Строки и пул строк» быстрых заданий пока нет
Можно проверить всю зону «Java Core» тестом на 10 минут.
Проверить себя за 10 минут