Equals() e hashCode()

5 respostas
Java_Player

Não entendi essa questão do MasterExam:

Given:

class SortOf{   
String name;
int bal;
String code;
short rate;
  
public int hashCode(){   
return (code.length()*bal);   
} 
  
public boolean equals(Object o){   
//insert code here   
}

}

Which of the following will fulfill the equals() and hashCode() contracts for thi class? (Choose all tha apply)

A return ((SortOf)o).bal == this.bal;
B return ((SortOf)o).code.length() == this.code.length();
C return ((SortOf)o).code.length() * (iSortOf)o).bal == this.code.length() * this.bal;
D return ((SortOf)o).code.length() * (iSortOf)o).bal * ((SortOf)o).rate == this.code.length() * this.bal * this.rate;

Qual a resposta certa? Eu marquei C, mas no exame fala que as corretas são C e D. Pq??

5 Respostas

Paulo_Silveira

Apesar do rate nao estar sendo usado no hashCode(), nao tem problema voce usar menos coisas… porque se temos dois iSort iguais, o hashcode deles baterao, apesar de nao estarem aproveitando o rate.

pense num caso parecido so que mais grave: o equals leva em consideracao um MONTE de atributos, mas o hashCode da um estupido return 0. ta ok, mas eh pessimo.

georgesq

na verdade ele se precave pelo extremo.

Paulo Silveira:
Apesar do rate nao estar sendo usado no hashCode(), nao tem problema voce usar menos coisas… porque se temos dois iSort iguais, o hashcode deles baterao, apesar de nao estarem aproveitando o rate.

pense num caso parecido so que mais grave: o equals leva em consideracao um MONTE de atributos, mas o hashCode da um estupido return 0. ta ok, mas eh pessimo.

Java_Player

Paulo Silveira:
Apesar do rate nao estar sendo usado no hashCode(), nao tem problema voce usar menos coisas… porque se temos dois iSort iguais, o hashcode deles baterao, apesar de nao estarem aproveitando o rate.

pense num caso parecido so que mais grave: o equals leva em consideracao um MONTE de atributos, mas o hashCode da um estupido return 0. ta ok, mas eh pessimo.

Então me explica a saída dessa classe:

class SortOf{
    
    String name;
    int bal;
    String code;
    short rate;
    
    public int hashCode(){
        return (code.length()*bal);
    }
    
    public boolean equals(Object o){
        return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate == this.code.length() * this.bal * this.rate;
    }
    
    
    public static void main(String[] args) {
        
        SortOf obj1 = new SortOf();
        obj1.bal = 1;
        obj1.code = "a";
        obj1.rate = 2;
        
        SortOf obj2 = new SortOf();
        obj2.bal = 2;
        obj2.code = "a";
        obj2.rate = 1;
        
        System.out.println("obj1.hashCode(): " + obj1.hashCode()); //imprime 1
        System.out.println("obj2.hashCode(): " + obj2.hashCode()); //imprime 2
        System.out.println(obj1.equals(obj2)); //imprime true
        
    }
   
}

Se os métodos equals() e hashCode() estivessem corretos, dois objetos “equals” não podem ter hashCodes diferentes, como ocorre no código acima.

Por isso que eu não entendi essa questão do MasterExam.

B

Edit: besteira minha.

ViniGodoy

Primeiro de tudo, essa é uma questão mal formulada. Sabe porque?

Nenhum dos métodos apresentados satisfaz a assinatura do equals. Leia a última condição, retirada do Javadoc da classe Object:
“For any non-null reference value x, x.equals(null) should return false.”

E nesse caso o que acontece? Os objetos lançam NullPointerException.

Você está certo, por sinal. O que o autor da questão não levou em consideração é que a multiplicação é comutativa (AB == BA). E isso torna a implementação do equals altamente sujeito a retornar true.

Se ele tivesse implementado o equals da maneira mais usual, comparando os atributos com ==, não teria tido esse problema e a reposta seria mesmo C e D.

Criado 30 de abril de 2008
Ultima resposta 1 de mai. de 2008
Respostas 5
Participantes 5