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

Preview:

Citation preview

Os métodosequals() e

hashCode()

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() A interface Comparable e o método

compareTo()

2

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

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

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

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

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

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

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

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

Lei da transitividade

O método equals() precisar ser transitivo.

objetoA.equals(objetoB)

e

objetoB.equals(objetoC)

objetoA.equals(objetoC)

11

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

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

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

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

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

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

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 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

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

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

classes que implementam a interface java.lang.Comparable

21

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

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

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

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

Recommended