Dúvida Testkiller - hashCode

Não entendi essa questão do Testkiller:

Given:

public class Person {
  private String name, comment;
  private int age;
  public Person(String n, int a, String c) {
    name = n; age = a; comment = c;
  }
  public boolean equals(Object o){
    if (! (o instanceof Person)) return false;
    Person p = (Person)o;
    return age == p.age && name.equals(p.name);
  }
}

What is the appropriated definition o the hashCode method in class Person?

A. return super.hashCode();
B. return super.hashCode() + age * 7;
C. return super.hashCode() + comment.hashCode() / 2;
D. return super.hashCode() + comment.hashCode() / 2 - age * 3;

Answer: B

Para mim, todas estão erradas… Não entendi por que a B está correta. Alguém sabe me explicar?

e ai java player blz?
Então a questão b está correta pq para objetos iguais o hash code tbm deve ser igual mas para objetos diferentes o hash code pode ser igual ou não…
no exemplo acima objetos iguais (idade e nome) ou com a mesma idade e nome diferente terão o mesmo hash code. Por isso a B é válida.
Espero te ajudado falowww

[quote=rodolfoliviero]e ai java player blz?
Então a questão b está correta pq para objetos iguais o hash code tbm deve ser igual mas para objetos diferentes o hash code pode ser igual ou não…
no exemplo acima objetos iguais (idade e nome) ou com a mesma idade e nome diferente terão o mesmo hash code. Por isso a B é válida.
Espero te ajudado falowww[/quote]

Mas o super.hashCode() vai acessar o hashCode() da classe Object, que é baseado na posição do objeto na memória, não?

Ou seja, mesmo que dois objetos Pessoa tenham os atributos age e name iguais, o super.hashCode() deles pode ser diferente.

eh verdade não tinha pensado nisso…vc tem razão fiquei na dúvida tbm…

Você copiou a questão do TestKiller errada (ou no teu TestKiller está errado). No TestKiller que eu tenho ta assim:

A. return super.hashCode();
B. return name.hashCode() + age * 7;
C. return name.hashCode() + comment.hashCode() /2;
D. return name.hashCode() + comment.hashCode() / 2 - age * 3;

Sendo assim, a B acessa o hashCode() da String name e não do objeto. Como o equals “usa” o age e o name para verificar igualdade, um hashCode do name e o age*7 serve como um hashCode válido. :smiley:

O Testkiller que eu peguei são 2 PDFs. Essa questão era do PDF que tem questões de Drag & Drop junto. Agora vi que essa questão tem no outro PDF também, e no outro tá certo.