Методы Object (toString, equals, hashCode)

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

Тренажер по Java

В Java все классы неявно наследуют от Object, получая базовые методы. Три ключевых метода, которые часто переопределяют:

  • toString() — возвращает строковое представление объекта. По умолчанию выводит имя класса и хеш, что малоинформативно.
  • equals(Object obj) — сравнивает объекты по содержимому. Без переопределения сравнивает ссылки (как ==).
  • hashCode() — возвращает числовой хеш объекта. Контракт: если equals() возвращает true, хеш-коды обязаны совпадать.

На этом интерактивном тренажёре вы попрактикуетесь в переопределении этих методов. Задания помогут понять, зачем нужен каждый метод и как они связаны между собой.

Список тем

1. Переопределение toString()

id: 40496_obj_01_tostring_fill

Дополните код класса Person, переопределив метод toString(). Вставьте пропущенные элементы: аннотацию для переопределения метода, ключевое слово возврата и обращения к полям name и age. Метод должен возвращать строку в формате "Person{name='[name]', age=[age]}".

Заполните пропуски
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    input1S
    public String toString() {
        input2S "Person{name='" + input3S + "', age=" + input4S + "}";
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Ошибка в методе equals()

id: 40496_obj_02_equals_error

В приведённом классе Person реализован метод equals() для сравнения объектов по полю name. Однако в коде допущена типичная ошибка, которая приведёт к некорректному сравнению объектов — два объекта Person с одинаковыми именами могут быть признаны неравными. Найдите строку с ошибкой и исправьте её.

Найдите ошибку и исправьте
public class Person {
    private String name;
 
    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        Person other = (Person) obj;
        return name == other.name;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Что вернёт equals()?

id: 40496_obj_03_predict_equals

Проанализируйте приведённый код на Java. В классе Person переопределён метод equals(), который сравнивает объекты только по полю id. В методе main создаются два объекта Person с одинаковым id, но разными значениями полей name и age. Что будет выведено на экран в результате выполнения метода main?

Выберите правильный вариант ответа
class Person {
    private int id;
    private String name;
    private int age;

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return id == person.id;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person(1, "Alice", 25);
        Person p2 = new Person(1, "Bob", 30);
        System.out.println(p1.equals(p2));
    }
}
Сообщения
Проверить
Показать подсказку

4. Методы Object и их назначение

id: 40496_obj_04_compare_methods

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
toString()
equals()
hashCode()
getClass()
clone()
Возвращает строковое представление объекта
Возвращает целочисленный хеш-код объекта
Возвращает объект Class с информацией о типе объекта
Сравнивает объект с другим на логическое равенство
Создаёт и возвращает копию объекта
Сообщения
Проверить
Показать подсказку

5. Собери метод hashCode()

id: 40496_obj_05_build_hashcode

Из предложенных строк соберите корректный метод hashCode() для класса Person с полями name (String) и age (int). Метод должен переопределять стандартный hashCode() из класса Object и использовать утилитный метод Objects.hash() для вычисления хеш-кода на основе полей объекта. Некоторые строки являются лишними и не должны входить в решение.

Перетяните в правильном порядке строки из одного блока в другой
@Override
public int hashCode() {
    return Objects.hash(name, age);
}
    return super.hashCode();
public boolean hashCode() {
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Найди переопределённые методы

id: 40496_obj_06_click_override

Перед вами класс Product на языке Java. В нём определено несколько методов: одни являются переопределением методов класса Object, другие — собственными методами этого класса. Внимательно изучите код и отметьте все методы, которые переопределяют методы класса Object. Собственные методы класса (геттеры, сеттеры, бизнес-методы) и конструктор отмечать не нужно.

Кликните по всем фрагментам, которые подходят под условие задания.
public class Product {
    private String name;
    private double price;

    {{public Product(String name, double price)~|~t1}} {
        this.name = name;
        this.price = price;
    }

    {{public String getName()~|~t2}} {
        return name;
    }

    {{public void setPrice(double price)~|~t3}} {
        this.price = price;
    }

    {{public double calculateDiscount(int percent)~|~t4}} {
        return price * (100 - percent) / 100;
    }

    @Override
    {{public String toString()~|~t5}} {
        return "Product{name='" + name + "', price=" + price + "}";
    }

    @Override
    {{public boolean equals(Object obj)~|~t6}} {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Product other = (Product) obj;
        return name.equals(other.name);
    }

    @Override
    {{public int hashCode()~|~t7}} {
        return Objects.hash(name);
    }
}
Сообщения
Проверить
Показать подсказку

7. Контракт equals и hashCode

id: 40496_obj_07_result_hashcode

Рассмотрите приведённый ниже код класса Person, в котором переопределён метод equals(). Этот метод сравнивает объекты только по полю name, игнорируя поле age. В методе main создаются два объекта с одинаковым именем, но разным возрастом, и для них вызывается equals(), который возвращает true. Согласно контракту между equals() и hashCode() в Java, если equals() для двух объектов возвращает true, должны ли их хэш-коды, возвращаемые методом hashCode(), быть равны? Введите ответ в поле ниже (одно слово: 'да' или 'true' для утвердительного ответа, 'нет' или 'false' для отрицательного).

Что должно получиться?
import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        // Сравниваем только по полю name, игнорируя age
        return Objects.equals(name, person.name);
    }

    // Метод hashCode() НЕ переопределён
    // Используется реализация по умолчанию из Object

    public static void main(String[] args) {
        Person p1 = new Person("Анна", 25);
        Person p2 = new Person("Анна", 30);
        
        System.out.println("p1.equals(p2) = " + p1.equals(p2));
        // Выведет: p1.equals(p2) = true
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру