О хэш-кодах: да, они почти, но не уникальны. :) Это зависит от реализации / теории, насколько они почти уникальны.
Но если мы говорим о JVM, мы должны прежде всего поговорить о том, какой хэш-код вы имели в виду.
Если вы говорите о результате метода hashCode (), который используется f.e. HashMap, то ответ: это зависит от вашей реализации и количества объектов в вашей JVM.
Это ваш выбор, план и знания, чтобы разрешить этот конфликт самореализованным методом hashCode ().
Если вы говорите о результате метода System.identityHashCode (obj), то он немного другой. Эта реализация не вызывает ваш метод hashCode (). И реализация не уникальна - но она почти уникальна, как и многие другие хеш-функции. :)
public class MyObject {
@Override
public int hashCode() {
return 42;
}
public static void main(String[] args) {
MyObject obj1 = new MyObject();
MyObject obj2 = new MyObject(); // Ta-da!
final int obj1Hash = System.identityHashCode( obj1 );
final int obj2Hash = System.identityHashCode( obj2 );
if( obj1Hash == obj2Hash ) throw new IllegalStateException();
}
}
В этом примере вы получите разные хэши, и в большинстве случаев они разные, но не обязательно уникальные ...
С наилучшими пожеланиями!