Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
This kind of switch can not be made lightly. It is not just a matter of raw performance, we have to understand how the change might affect existing applications. The default affects thousands of programs.
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
533 // This form uses an unguarded global Park-Miller RNG,
534 // so it's possible for two threads to race and generate the same RNG.
Сначала попался на глаза крайне несправедливо заминусованный комментарий. Именно SSSurkv совершенно верно предположил, что для вычисления Object.hashCode используется генератор случайных чисел.
И ещё мне интересно, а как реализуется, что хэш вычисляется только при первом обращении? Там, получается, блокировка должна быть?На сколько я понимаю из вышеприведённых исходников, там используются bias-locking (очень легковесный лок) и атомарная операция для присвоения нового хэша, если его нет. Если атомарная операция фейлится, используется более тяжелый лок.
забавный факт: хотспотовский hashCode никогда не вернет 0
Так, всего лишь добавив ключ JVM -XX:hashCode=5, я магическим образом ускорил свой алгоритм на 30%!
Откуда растут ноги у hashCode