capítulo 3. os métodos equals() e hashcode() equivalência de tipos primitivos equivalência de...
TRANSCRIPT
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