Если вам нужно проверить наличие дубликатов, вы должны использовать метод equals
вместо hashCode
. Если вы читаете Javadoc для Object.hashCode
, он говорит:
Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из этих двух объектов должен давать разные целочисленные результаты.
Это означает, что вы можете иметь два объекта o1 и o2 с одинаковым значением hashCode, но где o1.equals(o2) = false
. Вы будете обнаруживать ложный дубликат.
Чтобы проверить наличие дубликатов, вы можете использовать набор и проверять каждый добавленный объект, если Set.add(object) == true
. Если он возвращает false, это означает, что он уже был в наборе.
Инкрементный хэш в вашем описании кажется мне очень плохой хэш-функцией, если только все объекты не принадлежат к одному классу и между ними также есть инкрементная связь. Например, запустите этот код:
List l1 = Arrays.asList(1,2,3,4,5,6,7,8,9);
for (Object object : l1) {
System.out.println("hashCode: " + object.hashCode());
}
Вы не говорите, являются ли объекты вашими собственными определенными классами. Если они были вашими, всегда помните, что если вы переопределяете equals
, вы всегда должны переопределять также hashCode
. Если нет, то вы нарушаете контракт hashCode
, и некоторые классы (например, хешированные коллекции) могут вести себя не так, как вы ожидаете.