Object, Equals и HashCode Flashcards

1
Q

класс Object

A

Все классы являются наследниками суперкласса Object.
Объект Object может ссылаться на объект любого другого класса.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

методы класса Object

A
  1. Class getClass() — возвращает в рантайме класс данного объекта.
  2. int hashCode() — возвращает хеш-код
  3. boolean equals(Object obj) — сравнивает объекты.
  4. Object clone() - клонирование объекта
  5. String toString() — возвращает строковое представление объекта.
  6. void notify() — просыпается один поток, который ждет на “мониторе” данного объекта.
  7. void notifyAll() — просыпаются все потоки, которые ждут на “мониторе” данного объекта.
  8. void wait(long timeout) - поток переходит в режим ожидания в течение указанного времени.
  9. void wait() - приводит данный поток в ожидание, пока другой поток не вызовет notify() или notifyAll() методы для этого объекта.
  10. void wait(long timeout, int nanos) - приводит данный поток в ожидание, пока другой поток не вызовет notify() или notifyAll() для этого метода, или пока не истечет указанный промежуток времени.
  11. void finalize() - вызывается сборщиком мусора, когда garbage collector определил, что ссылок на объект больше нет.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

метод equals()

A

это метод класса Object, который используется для сравнения объектов на предмет логического равенства

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

метод hashCode()

A

Это метод класса Object, который возвращает целочисленное значение (хэш-код) объекта.
Хэш-код используется в таких структурах данных, как HashMap, HashSet и HashTable для более быстрого поиска объектов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Как работает метод equals() по умолчанию?

A

По умолчанию метод equals() в классе Object сравнивает ссылки (адреса в памяти) объектов. Если объекты указывают на один и тот же адрес в памяти, возвращается true, иначе — false.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Как работает метод hashCode() по умолчанию?

A

Метод hashCode() по умолчанию возвращает уникальное целочисленное значение, основанное на внутреннем представлении адреса объекта в памяти.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Зачем переопределять метод equals()?

A

Метод equals() переопределяют, чтобы сравнивать объекты по логическому содержимому (состоянию), а не по их адресам в памяти. Это полезно, когда нужно определить эквивалентность объектов на основе их полей.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Зачем переопределять метод hashCode()?

A

Переопределение hashCode() необходимо, если вы переопределили equals().
Это делается для того, чтобы объекты, которые считаются равными по методу equals(), имели одинаковый хэш-код, иначе структуры данных на основе хэширования будут работать неправильно.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Какие контракты должны выполняться при переопределении equals() и hashCode()?

A
  1. Рефлексивность: объект должен быть равен самому себе.
  2. Симметричность: если a.equals(b) возвращает true, то и b.equals(a) должно вернуть true.
  3. Транзитивность: если a.equals(b) и b.equals(c), то a.equals(c) должно также вернуть true.
  4. Непротиворечивость: если объекты не изменяются, многократные вызовы equals() должны возвращать одинаковое значение.
  5. Связь с hashCode(): если два объекта равны согласно equals(), то их хэш-коды также должны быть равны.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что произойдет, если переопределить equals(), но не переопределить hashCode()?

A

Если переопределить только equals(), но не переопределить hashCode(), то объекты, которые равны по equals(), могут иметь разные хэш-коды.
Это нарушит контракт между equals() и hashCode(), что приведет к ошибкам при работе с хэш-таблицами (например, HashMap, HashSet).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как правильно переопределить hashCode()?

A

Метод hashCode() должен быть согласован с equals().
Для этого обычно используют все поля объекта, участвующие в сравнении в методе equals().
Это можно сделать с помощью умножения хэш-кодов полей на простые числа для уменьшения коллизий.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Что такое “коллизия хэш-кодов”?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Почему важно минимизировать коллизии хэш-кодов?

A

Частые коллизии могут снижать производительность хэш-структур, так как они приводят к тому, что несколько объектов помещаются в одну корзину (bucket), и тогда они должны быть дополнительно проверены с помощью метода equals().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое консистентность между equals() и hashCode()?

A

Консистентность между этими методами означает, что если два объекта равны по equals(), то их хэш-коды тоже должны быть равны.
Это важно для корректной работы объектов в хэш-структурах данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что произойдет, если два объекта имеют одинаковый хэш-код, но не равны по equals()?

A

Такая ситуация допустима. Однако при вставке в хэш-структуру может произойти коллизия, и тогда будет использован метод equals() для точной проверки на равенство.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Может ли метод hashCode() вернуть отрицательное значение?

A

Да, метод hashCode() может возвращать отрицательные значения. Это допустимо, поскольку хэш-код является целым числом.

17
Q

Какова связь между equals() и сравнением по ссылке (оператором ==)?

A

Оператор == сравнивает ссылки на объекты, т.е. проверяет, указывают ли переменные на один и тот же объект в памяти.
Метод equals(), в свою очередь, можно переопределить для логического сравнения содержимого объектов, а не их адресов в памяти.

18
Q

В каких случаях лучше использовать instanceof для проверки типа в equals()?

A

instanceof полезен, если классы, между которыми происходит сравнение, могут быть связаны через наследование.
Например, если класс является частью иерархии и требуется сравнивать объекты не только одного класса, но и его наследников.

19
Q

Что такое “рассеивание” хэш-кодов?

A

Рассеивание хэш-кодов — это процесс, при котором значения хэш-кодов равномерно распределяются по диапазону возможных значений. Хорошее рассеивание хэш-кодов важно для уменьшения коллизий и повышения производительности хэш-структур.

20
Q

Какие особенности нужно учитывать при работе с equals() и hashCode() в многопоточной среде?

A

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