Java - метод hashCode () класса Point хорош, или я должен переопределить его и написать свой собственный? - PullRequest
5 голосов
/ 12 февраля 2012

Кстати, есть ли способ увидеть исходный код стандартных классов Java? Я делаю хэш-таблицу точек (HashSet<Point>) и хочу убедиться, что она будет хорошо хэшироваться, но я не вижу, как на самом деле выглядит метод hashCode (), поэтому я не знаю, насколько хорошо это действительно так. Может кто-нибудь мне помочь? Должен ли я переопределить это? И если так, есть ли простой способ сделать это, не создавая совершенно новый файл / класс Java?

Ответы [ 4 ]

8 голосов
/ 12 февраля 2012

Если вы ищете hashCode() из java.awt.Point, оно определяется как java.awt.geom.Point2D.

/**
 * Returns the hashcode for this <code>Point2D</code>.
 * @return      a hash code for this <code>Point2D</code>.
 */
public int hashCode() {
    long bits = java.lang.Double.doubleToLongBits(getX());
    bits ^= java.lang.Double.doubleToLongBits(getY()) * 31;
    return (((int) bits) ^ ((int) (bits >> 32)));
}

Обратите внимание, что вопрос "Хорошо ли будет хешироваться?" *Трудно ответить на 1008 *, это зависит в первую очередь от схемы использования.

Вы можете получить доступ к исходному коду почти всех "стандартных классов Java" , просто найдите файл src.zip вваш каталог установки JDK (или используйте IDE, например Eclipse / NetBeans, и нажмите F3 в имени класса).

3 голосов
/ 12 февраля 2012

Исходный код Java поставляется с JDK в файле src.zip. Обратите внимание, что Point 'hashCode() определено в его родительском элементе, java.awt.geom.Point2D.

Если вы решите, что существующая реализация не соответствует вашим стандартам, вы можете переопределить метод hashCode, используя анонимный класс, определенный «на лету»:

Point myPoint = new Point() {

    public int hashCode() {
        // custom implementation
    }

}; // <-- note required semicolon

Таким образом, вам не нужно создавать новый файл.

3 голосов
/ 12 февраля 2012

Есть ли способ на самом деле увидеть исходный код стандартных классов Java между прочим?

Да - я считаю, что обычно он поставляется с JDK, в файле src.zipв вашем каталоге JDK.Если это не так, то способ его получения будет зависеть от используемой версии Java.Полный исходный код JDK 6 доступен, например, здесь , или JDK 7 имеет отдельную страницу загрузки исходного кода с различными параметрами.

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

Если честно, я бы ожидал, что алгоритм хеширования будет достаточно разумным для общего назначения.Но тестирование всегда хорошая идея, если вы обеспокоены.

1 голос
/ 12 февраля 2012

Перейдите по этой ссылке и найдите Java SE 6 JDK Source Code. Загрузите исходный код и прочитайте его для себя. Я сомневаюсь, что у тебя все получится лучше, но хорошо быть скептиком.

...