2013-08-06 5 views
14

Когда у нас есть equals(), compareTo() методов, почему в Java существует метод hashcode()?Какова цель метода hashcode в java?

И если мы используем HashTable, мы должны переопределить метод hashcode(). Есть ли какая-либо особая причина, кроме быстрого доступа к случайным клавишам? Если мы переопределим метод hashcode(), какова будет вероятная реализация?

Как Java гарантирует уникальность объекта в памяти?


Hashcodes are typically used to enhance the performance of large collections of data.

В hashing вычислим hash code. это дополнительная задача. Когда мы выполняем дополнительную операцию для каждого объекта, который добавляется в коллекцию. Как улучшается производительность?

+0

Почему существует технология хэширования? Использовать эти методы по умолчанию. вы можете переопределить их, если хотите. –

+1

http://en.wikipedia.org/wiki/Java_hashCode() –

+1

http://www.thejavageek.com/2013/06/27/what-are-hashcodes/ –

ответ

12

Вы всегда должны переопределить equals и hashCode в тандеме, чтобы удовлетворить их взаимозависимых контракты. Класс, который их реализует противоречиво, просто нарушается и неприемлемо даже при минимальных стандартах разработки программного обеспечения.

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

+0

Какой код мы пишем внутри метода hashcode()? – MaheshVarma

+2

это самый быстрый вариант, только если хэш-коды объектов разумны. Имея hashcode return 0 для всех объектов, заполняет контракт, но сделает сборники на основе hash ужасно. Просто переопределить hashcode с чем-то, что слепо подчиняется контракту, не поможет. – eis

+1

@MaheshVarma Существует стандартная идиома для реализации хорошего 'hashCode', и она широко доступна в Интернете. Это также особенность большинства современных IDE для генерации всех методов 'equals' и' hashCode' для вас. –

-4
why there is a hashcode() method in Java? 

В принципе, всякий раз, когда мы вставляем уникальную структуру данных, структура данных гарантирует, что не будет вставлен дублирующий объект. Как это сделать?
Это осуществляется по договору, который реализует объекты, hashcode(), что уникальный идентификатор SSN человека. Но если вы хотите получить конкретный объект, тогда угадайте, что следует вызывать после сопоставления SSN, да, вы догадались, что это equals().

+0

У нас есть методы compareTo() и equals(). – MaheshVarma

+1

То есть equals() для, но не hashCode(). Совершенно верно иметь несколько объектов с одним и тем же хэш-кодом. – PeterMmm

+0

Слушайте, в уникальной структуре данных первый хэш-код сопоставляется, затем вызывается equals. Если хэш-код такой же и структура данных не позволяют использовать те же записи, объект будет отброшен, а equals не будет вызываться. –

2
+0

ссылка содержит правильный ответ, но вы должны поместить ее прямо в свой ответ. В основном у нас есть метод hashCode для поддержки контейнеров на основе хешей. Как там сказано, «в идеальных условиях контейнеры на основе хэшей предлагают как эффективную вставку, так и эффективное извлечение, а поддержка хэширования непосредственно в объектной модели облегчает разработку и использование контейнеров на основе хешей». – eis

1

Используя метод compareTo, вы устанавливаете "total order" для своих объектов. Полный порядок является довольно слабым свойством: он может только сказать вам, что один объект «меньше» другого, но он не дает вам понятия «насколько далеко друг от друга» есть два объекта.

Например, если у вас есть N объектов в структуре данных с ключом, и вы хотите найти значение для данного ключа. Имея только общий порядок, вам нужно сравнить не менее O (log N), чтобы найти соответствующий ключ.

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

Смежные вопросы