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()
2
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() notifyAll()
equals(Object) toString()
finalize() wait()
getClass() wait(long)
hashCode() wait(long, int)
notify()
6
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
8
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
9
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)
12
Devem retornar sempre
o mesmo resultado
O mtodo hashCode()
Outro mtodo derivado da superclasse Object
Tambm deve ser reimplementado (sobrescrito)
pelo programador conforme necessidade da
aplicao
clone() notifyAll()
equals(Object) toString()
finalize() wait()
getClass() wait(long)
hashCode() wait(long, int)
notify()
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