25
Os métodos equals() e hashCode() Capítulo 3

Capítulo 3. Os métodos equals() e hashCode() Equivalência de tipos primitivos Equivalência de String Equivalência de outros objetos O método equals()

Embed Size (px)

Citation preview

Page 1: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Os métodosequals() e

hashCode()

Capítulo 3

Page 2: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Os métodos equals() e hashCode()

Equivalência de tipos primitivos Equivalência de String Equivalência de outros objetos O método equals() O método hashCode() A interface Comparable e o método

compareTo()

2

Page 3: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Equivalência de tipos primitivos Para verificar a equivalência 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

Page 4: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Equivalência de Strings

Para verificar a equivalência de valores String utilizamos o método 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

Page 5: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Equivalência de outros objetos Para verificar a equivalência de outros tipos de objetos

também utilizamos o método equals()

Funcionario f1 = new Funcionario(1021, "João", "Vendedor", 1815.5);

Funcionario f2 = new Funcionario(.......);

if (f1.equals(f2)) {

System.out.println("Funcionarios iguais");

} else {

System.out.println("Funcionarios diferentes");

}

5

Page 6: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

O método equals() Um dos métodos derivados da superclasse Object Deve ser reimplementado (sobrescrito) pelo

programador conforme necessidade da aplicação

• clone() • notifyAll()

• equals(Object) • toString()

• finalize() • wait()

• getClass() • wait(long)

• hashCode() • wait(long, int)

• notify()

6

Page 7: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Implementando o método equals()

public class Funcionario {

private int matricula;private String nome;private String cargo;private double salario;

// ... métodos gets e sets

public boolean equals(Object object) {if (!(object instanceof Funcionario))

return false;Funcionario outro = (Funcionario) object;return (this.matricula == outro.matricula);

}}

7

Page 8: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Leis de igualdade

Ao implementar o método equals(), certifique-se de atender as 4 leis de igualdade. Para isto seu método equals() deve ser:

SimétricoReflexivoTransitivoConsistente

8

Page 9: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Lei da simetria

O método equals() precisar ser simétrico. Isto significa que a regra abaixo sempre deve ser verdadeira para qualquer instância de sua classe:

objetoA.equals(objetoA)

sempre deve ser verdade

9

Page 10: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Lei da reflexividade

O método equals() precisar ser reflexivo. Isto significa que as expressões abaixo precisam ser equivalentes:

objetoA.equals(objetoB)

objetoB.equals(objetoA)

10

Page 11: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Lei da transitividade

O método equals() precisar ser transitivo.

objetoA.equals(objetoB)

e

objetoB.equals(objetoC)

objetoA.equals(objetoC)

11

Page 12: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Lei da consistência

O método equals() precisar ser consistente. Isto significa que chamadas sucessivas do método equals() não devem alterar o seu resultado.

objetoA.equals(objetoB)

objetoA.equals(objetoB)

objetoA.equals(objetoB)

...

objetoA.equals(objetoB)

12

Devem retornar sempreo mesmo resultado

Page 13: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

O método hashCode() Outro método derivado da superclasse Object Também deve ser reimplementado (sobrescrito)

pelo programador conforme necessidade da aplicação

• clone() • notifyAll()

• equals(Object) • toString()

• finalize() • wait()

• getClass() • wait(long)

• hashCode() • wait(long, int)

• notify()

13

Page 14: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

O método hashCode() Juntamente com o método equals(), o

método hashCode() é utilizado para diferenciar um objeto de outro em estruturas de dados que não permitem repetição.

equals()

Diferencia um objeto de outro impedindo duplicidade em estruturas sem repetição.

hashCode()

Retorna um número inteiro utilizado como identificador único do objeto instanciado.

14

Page 15: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

O método hashCode() Devemos nos preocupar em implementar o

método hashCode() ao criar classes cujas instâncias serão utilizadas em estruturas de dados como listas, mapas, conjuntos, etc.

Ao implementar o método 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

Page 16: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Implementando o método hashCode()public class Funcionario {

private int matricula;private String nome;private String cargo;

// ... métodos 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

Page 17: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

A interface Comparable

Assinala um critéria de comparação entre objetos, permitindo definir se um objeto é maior ou menor que um outro

Deve ser implementado em classes cujas instâncias serão utilizadas em estruturas de dados ordenáveis.

17

Page 18: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

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

Page 19: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Comparando Strings

Para a comparação de valores String utilizamos o método 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

Page 20: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Comparando outros objetos Para realizar a comparação de outros tipos de objetos

também utilizamos o método compareTo()

Funcionario f1 = new Funcionario(1021, "João", "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

Page 21: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Implementando a interface Comparable O método compareTo() só funciona em

classes que implementam a interface java.lang.Comparable

21

Page 22: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Implementando a interface Comparablepublic class Funcionario implements Comparable<Funcionario> {

private int matricula;private String nome;private String cargo;

// ... métodos 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

Page 23: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Exercício Crie uma classe denominada Produto contendo os

seguintes atributos:

codigo: inteiro descricao: String preco: double

Implemente os métodos get e set para cada um destes atributos

Implemente o método equals() realizando a comparação pela descrição do produto. Em outras palavras, dois produtos serão iguais quando possuírem a mesma descrição.

23

Page 24: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Exercício (continuação) A classe Produto deverá implementar a interface

Comparable<Produto> bem como seu método compareTo() realizando a comparação também pela descrição em ordem crescente.

Em outras palavras, o método compareTo() deverá retornar:

Um número positivo quando a descrição do item em questão for alfabeticamente maior que a descrição do outro produto

Um número negativo quando contrário Zero quando tiverem a mesma descrição

24

Page 25: Capítulo 3. Os métodos equals() e hashCode()  Equivalência de tipos primitivos  Equivalência de String  Equivalência de outros objetos  O método equals()

Exercício (fim) Crie um classe executável chamada

ExercicioComparable e no método main() crie 3 instâncias 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 método compareTo() de cada objeto.

25