Я думаю, что ты прав. Хотя хэш удваивает ints, двойной может испортить хэш. Вот почему, как говорит Джош Блох в «Эффективной Java», когда вы используете double в качестве входа в хеш-функцию, вы должны использовать doubleToLongBits () . Аналогичным образом, используйте floatToIntBits для поплавков.
В частности, чтобы использовать двойной как ваш хэш, следуя рецепту Джоша Блоха, вы бы сделали:
public int hashCode() {
int result = 17;
long temp = Double.doubleToLongBits(the_double_field);
result = 37 * result + ((int) (temp ^ (temp >>> 32)));
return result;
}
Это из пункта 8 Эффективная Java, «Всегда переопределять hashCode при переопределении равных». Это можно найти в этой pdf главы из книги .
Надеюсь, что это поможет.