У меня есть следующий модульный тест: я создаю 2 разных объекта моего настраиваемого типа. Я сравниваю их хэш-коды, которые просто возвращают хэш-код их имен, то есть String.hashCode().HashMap дает тот же hashCode для различного содержимого
Затем я создаю 2 HashSets, каждый из которых содержит одну переменную и сравнивает хэш-коды наборов.
В обоих случаях хэш-коды отличаются, как и ожидалось.
Однако, если я создаю HashMap с именем в качестве индекса и значением Variable as, утверждение терпит неудачу, т. Е. Сравнивает его. Почему это?
Использование Oracle Java 1.8.
EDIT: Я могу добавить еще одну гарантию: Assert.assertNotEquals(map1, map2);
также имеет место. Кроме того, я думаю, что я расцениваю это предложение правильно:
Хэш код карты определяется как сумма хэш-кодов каждого входа в entrySet карты() вид. Это гарантирует, что m1.equals (m2) подразумевает, что m1.hashCode() == m2.hashCode() для любых двух карт m1 и m2, как требуется общим контрактом Object.hashCode(). Взятые из http://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.html#hashCode%28%29
@Test
public void test() {
// this assertion holds
Assert.assertNotEquals(new Variable("x").hashCode(), new Variable("y").hashCode());
Set<Variable> set1 = new HashSet<>();
set1.add(new Variable("x"));
Set<Variable> set2 = new HashSet<>();
set2.add(new Variable("y"));
// this assertion also holds
Assert.assertNotEquals(set1.hashCode(), set2.hashCode());
HashMap<String, Variable> map1 = new HashMap<>();
map1.put("x", new Variable("x"));
HashMap<String, Variable> map2 = new HashMap<>();
map2.put("y", new Variable("y"));
// why does this assertion fail?
Assert.assertNotEquals(map1.hashCode(), map2.hashCode());
}
Вот определение класса переменной.
public class Variable {
private String name;
public Variable(String name) {
this.name = name;
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Variable))
return false;
return name.equals(((Variable) obj).name);
}
}
Почему, по вашему мнению, хэш-код должен быть другим в любом случае? –
Я ожидаю, что 3-е утверждение будет выполнено, потому что первое утверждение выполнено. По той же причине, почему и второе утверждение. – hooch
Использует ли конструктор 'Variable' для присваивания переданного значения' name'? –