В Java сравнение строк — частый источник ошибок. Оператор == сравнивает ссылки (адреса объектов в памяти), а метод equals() сравнивает содержимое строк.
==вернёт true только если это один и тот же объектequals()вернёт true если символы в строках одинаковые- Строковые литералы кэшируются в String PoolПул строк — область памяти для хранения уникальных строковых литералов
Этот практический тренажёр поможет понять разницу между сравнением ссылок и содержимого. Интерактивные задания покрывают типичные случаи: литералы, new String(), результаты методов. Бесплатные уроки для изучения Java онлайн.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Заполнить метод сравнения
В этом задании вам предстоит дополнить фрагмент кода на Java, который демонстрирует сравнение строк. В коде используются два разных подхода: сравнение по ссылке (оператор ==) и сравнение по содержимому (метод equals). Ваша задача — заполнить пропуски, чтобы код корректно выполнялся и выводил ожидаемый результат, соответствующий логике сравнения строк в Java. Обратите внимание на контекст каждого пропуска — он подскажет, какой именно оператор или метод требуется вставить.
String str1 = "Hello";
String str2 = new String("Hello");
if (str1 input1S str2) {
System.out.println("Строки равны по ссылке");
} else {
System.out.println("Строки не равны по ссылке");
}
if (str1.input2S(str2)) {
System.out.println("Строки равны по содержимому");
} else {
System.out.println("Строки не равны по содержимому");
}2. Исправить сравнение строк
В этом фрагменте Java-кода есть ошибка при сравнении строковых объектов. Код использует оператор == для сравнения двух строк, что приводит к неверному результату, поскольку == сравнивает ссылки на объекты, а не их содержимое. Исправьте строку с ошибкой, чтобы корректно сравнить строки по значению и получить ожидаемый вывод.
public class Main { public static void main(String[] args) { String str1 = "Hello"; String str2 = new String("Hello"); System.out.println("Строки равны? " + (str1 == str2)); }}3. Что вернёт сравнение литералов
Проанализируйте приведённый фрагмент кода на Java, в котором используются строковые литералы и объекты String, созданные через new. Определите, какие значения (true или false) будут получены в результате выполнения каждого из трёх сравнений строк. Выберите вариант, который правильно указывает результаты всех трёх сравнений.
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
boolean b1 = s1 == s2;
boolean b2 = s1 == s3;
boolean b3 = s1.equals(s3);4. Сравнение new String()
Проанализируйте приведённый фрагмент кода на Java, в котором создаются две строки с помощью конструктора new String(). Определите, какие результаты вернут сравнения с использованием оператора == и метода equals(). Выберите все верные утверждения из предложенных вариантов.
String a = new String("hello");
String b = new String("hello");
boolean result1 = (a == b);
boolean result2 = a.equals(b);5. Оператор == и метод equals()
В этом задании вам нужно сопоставить утверждения о сравнении в Java с соответствующим оператором или методом: == или equals(). В левой колонке приведены пять утверждений, описывающих различные аспекты сравнения. В правой колонке представлены варианты '==' и 'equals()', но обратите внимание, что они повторяются, и правильное сопоставление может быть выполнено в нескольких эквивалентных комбинациях. Ваша задача — сопоставить каждое утверждение с подходящим вариантом, учитывая, что для некоторых утверждений подходит только один из них.
6. Распределить результаты сравнений
Перед вами 8 выражений сравнения строк в Java, использующих оператор == и метод equals(), а также работу с литералами, конструктором new String() и методом intern(). Ваша задача — распределить каждое выражение в одну из двух категорий: «Вернёт true» или «Вернёт false». Обратите внимание на особенности сравнения ссылок (==) и значений (equals()), а также на поведение String Pool при работе со строковыми литералами и методом intern().
"Java" == "Java""Java".equals("Java")new String("Java") == new String("Java")new String("Java").equals(new String("Java"))"Java" == new String("Java")"Java".equals(new String("Java"))"Java".intern() == new String("Java").intern()"Java" == "Ja" + "va"7. Написать результат сравнения
Проанализируйте приведённый фрагмент кода на Java. В нём создаются строки с использованием конкатенации, а затем выполняется сравнение с помощью оператора ==. Определите, что будет выведено на экран в результате выполнения программы. Введите одно слово: true или false.
public class Main {
public static void main(String[] args) {
String s = "test";
String t = "te";
String u = t + "st";
System.out.println(s == u);
}
}8. Найти некорректные сравнения
Внимательно изучите приведённый фрагмент кода на Java. В нём представлено несколько сравнений строковых переменных и литералов. Ваша задача — найти и выделить кликом все места, где для сравнения содержимого строк используется оператор '==', что является некорректным подходом. Оператор '==' сравнивает ссылки на объекты, а не их содержимое, поэтому для сравнения строк по значению следует использовать метод equals(). Не отмечайте сравнения, в которых уже используется метод equals(), а также другие операторы или выражения.
public class StringComparisonDemo {
public static void main(String[] args) {
String literal1 = "Hello";
String literal2 = "Hello";
String obj1 = new String("World");
String obj2 = new String("World");
String computed = "Hel" + "lo";
String part1 = "Hel";
String part2 = "lo";
String concatenated = part1 + part2;
// Сравнения
if ({{literal1 == literal2~|~t1}}) { // (1)
System.out.println("Литералы равны через ==");
}
if ({{literal1.equals(literal2)~|~t2}}) { // (2)
System.out.println("Литералы равны через equals");
}
if ({{obj1 == obj2~|~t3}}) { // (3)
System.out.println("Объекты равны через ==");
}
if ({{obj1.equals(obj2)~|~t4}}) { // (4)
System.out.println("Объекты равны через equals");
}
if ({{computed == "Hello"~|~t5}}) { // (5)
System.out.println("Вычисляемая строка равна литералу через ==");
}
if ({{concatenated == "Hello"~|~t6}}) { // (6)
System.out.println("Конкатенация равна литералу через ==");
}
if ({{concatenated.equals("Hello")~|~t7}}) { // (7)
System.out.println("Конкатенация равна литералу через equals");
}
if ({{literal1 == "Hello"~|~t8}}) { // (8)
System.out.println("Переменная равна литералу через ==");
}
}
}9. Выбрать способ сравнения
В представленном коде создаются три строковые переменные. Переменные s1 и s2 содержат одинаковый текст "Hello", но s2 создана через конструктор new String(), поэтому это разные объекты в памяти. Переменная s3 — это ссылка на тот же объект, что и s1. Заполните пропуски, выбирая правильный способ сравнения согласно комментариям: для сравнения содержимого строк используйте соответствующий метод, для проверки идентичности объектов — оператор.
String s1 = "Hello";
String s2 = new String("Hello");
String s3 = s1;
// Содержимое одинаковое?
boolean content = s1input1S(s2);
// Ссылки указывают на один объект?
boolean ref = s1 input2S s3;
// Содержимое s2 равно s1?
boolean same = s2input3S(s1);