понедельник, 19 января 2009 г.

Ответы на вопросы для собеседования по Java SE (Часть 2)

Продолжаю цикл статей, посвященных ответам на вопросы по Java Core.
Ответы на вопросы для собеседования по Java SE (Часть 1)
Ответы на вопросы для собеседования по Java SE (Часть 3)

Следующие 5 вопросов, тесно связаны с пятеркой предыдущих вопросов, поэтому повторяться не буду. Напишу краткие ответы:

6. Какая связь между hashCode и equals?
Объекты равны, когда equals и hashCode возвращает одни и те же значения. Но необязательно, чтобы два различных объекта возвращали различные хэш коды(такая ситуация называется коллизией).

7. Каким образом реализованы методы hashCode и equals в классе Object?
Реализация метода equals в классе Object сводится к проверке на равенство двух ссылок:

public boolean equals(Object obj) {
return (this == obj);
}


Реализация же метода hashCode класса Object сделана нативной, т.е. определенной не с помощью Java-кода:
public native int hashCode();
Он обычно возвращает адрес объекта в памяти.

8. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
Они будут неправильно хранится в контейнерах, использующих хэш коды, таких как HashMap, HashSet.

9. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
Есть. Необходимо использовать уникальные, лучше примитивные поля, такие как id, uuid, например. Причем, если эти поля задействованы при вычислении hashCode, то нужно их задействовать при выполнении equals.
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться.

10. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
Будут. Опять же будут проблемы связанные с хэш коллекциями. А именно, не сможем выбрать элемент из хэш-коллекции, его как будто и не будет.
----

Продолжение следует...

Комментариев нет:

Отправить комментарий