Сравнение строк: equals vs ==

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

В Java сравнение строк — частый источник ошибок. Оператор == сравнивает ссылки (адреса объектов в памяти), а метод equals() сравнивает содержимое строк.

  • == вернёт true только если это один и тот же объект
  • equals() вернёт true если символы в строках одинаковые
  • Строковые литералы кэшируются в String PoolПул строк — область памяти для хранения уникальных строковых литералов

Этот практический тренажёр поможет понять разницу между сравнением ссылок и содержимого. Интерактивные задания покрывают типичные случаи: литералы, new String(), результаты методов. Бесплатные уроки для изучения Java онлайн.

Список тем

1. Заполнить метод сравнения

id: 40464_str_cmp_01

В этом задании вам предстоит дополнить фрагмент кода на 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("Строки не равны по содержимому");
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Исправить сравнение строк

id: 40464_str_cmp_02

В этом фрагменте Java-кода есть ошибка при сравнении строковых объектов. Код использует оператор == для сравнения двух строк, что приводит к неверному результату, поскольку == сравнивает ссылки на объекты, а не их содержимое. Исправьте строку с ошибкой, чтобы корректно сравнить строки по значению и получить ожидаемый вывод.

Найдите ошибку и исправьте
public class Main {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = new String("Hello");
        System.out.println("Строки равны? " + (str1 == str2));
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Что вернёт сравнение литералов

id: 40464_str_cmp_03

Проанализируйте приведённый фрагмент кода на 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()

id: 40464_str_cmp_04

Проанализируйте приведённый фрагмент кода на 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()

id: 40464_str_cmp_05

В этом задании вам нужно сопоставить утверждения о сравнении в Java с соответствующим оператором или методом: == или equals(). В левой колонке приведены пять утверждений, описывающих различные аспекты сравнения. В правой колонке представлены варианты '==' и 'equals()', но обратите внимание, что они повторяются, и правильное сопоставление может быть выполнено в нескольких эквивалентных комбинациях. Ваша задача — сопоставить каждое утверждение с подходящим вариантом, учитывая, что для некоторых утверждений подходит только один из них.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
сравнивает ссылки
сравнивает содержимое
работает для примитивов
является методом класса String
может вернуть true для разных объектов с одинаковым текстом
equals()
equals()
==
==
equals()
Сообщения
Проверить
Показать подсказку

6. Распределить результаты сравнений

id: 40464_str_cmp_06

Перед вами 8 выражений сравнения строк в Java, использующих оператор == и метод equals(), а также работу с литералами, конструктором new String() и методом intern(). Ваша задача — распределить каждое выражение в одну из двух категорий: «Вернёт true» или «Вернёт false». Обратите внимание на особенности сравнения ссылок (==) и значений (equals()), а также на поведение String Pool при работе со строковыми литералами и методом intern().

Перетяните элементы в соответствующие блоки
Вернёт true
Вернёт false
"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. Написать результат сравнения

id: 40464_str_cmp_07

Проанализируйте приведённый фрагмент кода на 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. Найти некорректные сравнения

id: 40464_str_cmp_08

Внимательно изучите приведённый фрагмент кода на 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. Выбрать способ сравнения

id: 40464_str_cmp_09

В представленном коде создаются три строковые переменные. Переменные 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);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру