Você está na página 1de 25

Captulo 3

Os mtodos equals() e hashCode()


Equivalncia de tipos primitivos Equivalncia de String Equivalncia de outros objetos O mtodo equals() O mtodo hashCode() A interface Comparable e o mtodo compareTo()

Equivalncia de tipos primitivos

Para verificar a equivalncia de valores primitivos utilizamos o operador ==


int x = 8; int y = 4 + 4; if (x == y) { System.out.println("Valores iguais."); } else { System.out.println("Valores diferentes."); }
3

Equivalncia de Strings

Para verificar a equivalncia de valores String utilizamos o mtodo equals()


String temp = "nova"; String valor1 = "casanova"; String valor2 = "casa" + temp; if (valor1.equals(valor2)) { System.out.println("Strings iguais"); } else { System.out.println("Strings diferentes"); }
4

Equivalncia de outros objetos

Para verificar a equivalncia de outros tipos de objetos tambm utilizamos o mtodo equals()

Funcionario f1 = new Funcionario(1021, "Joo", "Vendedor", 1815.5); Funcionario f2 = new Funcionario(.......); if (f1.equals(f2)) { System.out.println("Funcionarios iguais"); } else { System.out.println("Funcionarios diferentes"); }
5

O mtodo equals()

Um dos mtodos derivados da superclasse Object Deve ser reimplementado (sobrescrito) pelo programador conforme necessidade da aplicao
clone() equals(Object) finalize() getClass() hashCode() notify() notifyAll() toString() wait() wait(long) wait(long, int)

Implementando o mtodo equals()


public class Funcionario { private int matricula; private String nome; private String cargo; private double salario; // ... mtodos gets e sets public boolean equals(Object object) { if (!(object instanceof Funcionario)) return false; Funcionario outro = (Funcionario) object; return (this.matricula == outro.matricula); } }
7

Leis de igualdade

Ao implementar o mtodo equals(), certifique-se de atender as 4 leis de igualdade. Para isto seu mtodo equals() deve ser:
Simtrico Reflexivo

Transitivo
Consistente

Lei da simetria

O mtodo equals() precisar ser simtrico. Isto significa que a regra abaixo sempre deve ser verdadeira para qualquer instncia de sua classe:

objetoA.equals(objetoA) sempre deve ser verdade

Lei da reflexividade

O mtodo equals() precisar ser reflexivo. Isto significa que as expresses abaixo precisam ser equivalentes:

objetoA.equals(objetoB)

objetoB.equals(objetoA)

10

Lei da transitividade

O mtodo equals() precisar ser transitivo.

objetoA.equals(objetoB) e objetoB.equals(objetoC)

objetoA.equals(objetoC)

11

Lei da consistncia

O mtodo equals() precisar ser consistente. Isto significa que chamadas sucessivas do mtodo equals() no devem alterar o seu resultado.
objetoA.equals(objetoB) objetoA.equals(objetoB) objetoA.equals(objetoB) ... objetoA.equals(objetoB)

Devem retornar sempre o mesmo resultado

12

O mtodo hashCode()

Outro mtodo derivado da superclasse Object Tambm deve ser reimplementado (sobrescrito) pelo programador conforme necessidade da aplicao
clone() equals(Object) finalize() getClass() hashCode() notify() notifyAll() toString() wait() wait(long) wait(long, int)

13

O mtodo hashCode()

Juntamente com o mtodo equals(), o mtodo hashCode() utilizado para diferenciar um objeto de outro em estruturas de dados que no permitem repetio.
equals()
Diferencia um objeto de outro impedindo duplicidade em estruturas sem repetio.

hashCode()
Retorna um nmero inteiro utilizado como identificador nico do objeto instanciado.
14

O mtodo hashCode()

Devemos nos preocupar em implementar o mtodo hashCode() ao criar classes cujas instncias sero utilizadas em estruturas de dados como listas, mapas, conjuntos, etc. Ao implementar o mtodo hashCode() em uma classe, geralmente pegamos carona com o hashCode de cada um de seus membros para que possamos gerar um ID que dependa de cada um de seus atributos.

15

Implementando o mtodo hashCode()


public class Funcionario { private int matricula; private String nome; private String cargo; // ... mtodos gets e sets

public int hashCode() { int hash = 1; hash = 31 * hash + matricula; hash = 31 * hash + (nome == null ? 0 : nome.hashCode()); hash = 31 * hash + (cargo == null ? 0 : cargo.hashCode()); return hash; }
}
16

A interface Comparable

Assinala um critria de comparao entre objetos, permitindo definir se um objeto maior ou menor que um outro Deve ser implementado em classes cujas instncias sero utilizadas em estruturas de dados ordenveis.

17

Comparando tipos primitivos

Para comparar valores primitivos utilizamos os operadores relacionais > (maior), < (menor) e outros
int x = 8; int y = 4 + 6;
if (x > y) { System.out.println(O primeiro valor maior."); } else if (x < y) { System.out.println(O segundo valor maior."); } else { System.out.println("Valores iguais."); }
18

Comparando Strings

Para a comparao de valores String utilizamos o mtodo compareTo()


String valor1 = Manuel"; String valor2 = Joaquim; if (valor1.compareTo(valor2) > 0) { System.out.println(O primeiro String maior"); } else if (valor1.compareTo(valor2) < 0) { System.out.println(O segundo String maior"); } else { System.out.println("Strings iguais"); }
19

Comparando outros objetos

Para realizar a comparao de outros tipos de objetos tambm utilizamos o mtodo compareTo()

Funcionario f1 = new Funcionario(1021, "Joo", "Vendedor", 1815.5); Funcionario f2 = new Funcionario(.......); if (f1.compareTo(f2) > 0) { System.out.println(O primeiro funcionario maior"); } else if (f1.compareTo(f2) < 0) { System.out.println(O segundo funcionario maior"); } else { System.out.println("Funcionarios iguais"); }
20

Implementando a interface Comparable

O mtodo compareTo() s funciona em classes que implementam a interface java.lang.Comparable

21

Implementando a interface Comparable


public class Funcionario implements Comparable<Funcionario> { private int matricula; private String nome; private String cargo; // ... mtodos gets e sets public int compareTo(Funcionario outro) { if (this.nome.compareTo(outro.nome) > 0) { return 1; } else (this.nome.compareTo(outro.nome) < 0) { return -1; } else { return 0; } } }
22

Exerccio

Crie uma classe denominada Produto contendo os seguintes atributos:


codigo: inteiro descricao: String preco: double

Implemente os mtodos get e set para cada um destes atributos Implemente o mtodo equals() realizando a comparao pela descrio do produto. Em outras palavras, dois produtos sero iguais quando possurem a mesma descrio.
23

Exerccio (continuao)

A classe Produto dever implementar a interface Comparable<Produto> bem como seu mtodo compareTo() realizando a comparao tambm pela descrio em ordem crescente.

Em outras palavras, o mtodo compareTo() dever retornar:


Um nmero positivo quando a descrio do item em

questo for alfabeticamente maior que a descrio do outro produto Um nmero negativo quando contrrio Zero quando tiverem a mesma descrio
24

Exerccio (fim)

Crie um classe executvel chamada ExercicioComparable e no mtodo main() crie 3 instncias da classe produto conforme abaixo:
Produto p1 = new Produto(805, Leite Integral, 1.70); Produto p2 = new Produto(930, Caf em p, 4.80); Produto p3 = new Produto(110, Manteiga, 2.80);

Em seguida, exiba cada um dos produtos conforme a ordem definida pelo mtodo compareTo() de cada objeto.

25

Você também pode gostar