Revisão
Imagina que você resolveu criar sua lista de amigos onde cada amigo
com (nome, apelido, data de nascimento) contenha dados de contato
com (email, whatsapp, nickname instagram) e endereço
com (logradouro, numero, cidade, sigla do estado).
- Defina a estrutura de classes que achar necessária
- Crie instâncias de ao menos 03 dos seus melhores amigos
- Imprima informações aleatórias de cada amigo, exemplo:
Gleyson Sampaio tem o email gleyson@digytal.com.br
Equals versus ==
== versus equals: Quando estamos comparando valores primitivos, como int
, double
, float
, long
, short
, byte
, char
, boolean
, usamos o operador ==
. Quando estamos comparando objetos, usamos o método equals
.
Comparações Avançadas
Quando se refere a comparação de conteúdos na linguagem, devemos ter um certo domínio, de como o Java trata o armazenamento destes valores na memória.
Quando estiver mais familiarizado com a linguagem, recomendamos se aprofundar no conceito de espaço em memória Stack versus Heap.
Vamos a alguns exemplos para ilustrar:
Valor e referência: Precisamos entender que em Java tudo é objeto, logo, objetos diferentes podem ter as mesmas características, mas lembrando, são objetos diferentes.
// ComparacaoAvancada.java
public static void main(String[] args) {
String nome1 = "JAVA";
String nome2 = "JAVA";
System.out.println(nome1 == nome2); //true
String nome3 = new String("JAVA");
System.out.println(nome1 == nome3); //false
String nome4 = nome3;
System.out.println(nome3 == nome4); //true
//equals na parada
System.out.println(nome1.equals(nome2)); //??
System.out.println(nome2.equals(nome3)); //??
System.out.println(nome3.equals(nome4)); //??
}
Comparando números wrappers
// ComparacaoAvancada.java
public static void main(String[] args) {
int numero1 = 130;
int numero2 = 130;
System.out.println(numero1 == numero2); //true
Integer numero1 = 130;
Integer numero2 = 130;
System.out.println(numero1 == numero2); //false
//uma grande pegadinha, até 127 o resultado seria true
// A razão pela qual o resultado é false, é devido o Java tratar os valores
// Como objetos a partir de agora.
// Qual a solução ?
// Quando queremos comparar objetos, usamos o método equals
System.out.println(numero1.equals(numero2));
}
Comparando objetos
Chegou o momento mais temido ao tratar comparação de valores, a fomosa comparação entre objetos na linguagem Java.
Vamos imaginar que uma fábrica de automóveis acaba de fabricar 05 veículos da mesma, cor, marca e modelo. Transcrevendo para Java, esta seria a estrutura de código:
//arquivo Carro.java
class Carro {
//atributos de mesmo tipo
String cor, marca, modelo;
//construtor
Carro (String cor, String marca, String modelo){
this.cor = cor;
this.marca = marca;
this.modelo = modelo;
}
}
//arquivo FabricaCarro.java
public class FabricaCarro {
public static void main (String [] args){
Carro carro1 = new Carro("branca","fiat","palio");
Carro carro2 = new Carro("branca","fiat","palio");
Carro carro3 = new Carro("branca","fiat","palio");
Carro carro4 = new Carro("branca","fiat","palio");
Carro carro5 = new Carro("branca","fiat","palio");
//case01
System.out.println(carro1 == carro2); //false
//case02
System.out.println(carro1.equals(carro2)); //false
}
}
Mesmo objetos contendo as mesmas características ainda serão considerados objetos diferentes até que você determine algum atributo de identificação utilizando
equals
e hashcode
Melhorando nosso contexto
//arquivo Carro.java
class Carro {
//atributos de mesmo tipo
String cor, marca, modelo;
//construtor
Carro (String cor, String marca, String modelo){
this.cor = cor;
this.marca = marca;
this.modelo = modelo;
}
//identificador de igualdade
//os 3 atributos precisem ser idênticos
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Carro carro = (Carro) o;
return Objects.equals(cor, carro.cor) && Objects.equals(marca, carro.marca) && Objects.equals(modelo, carro.modelo);
}
@Override
public int hashCode() {
return Objects.hash(cor, marca, modelo);
}
}
//arquivo FabricaCarro.java
public class FabricaCarro {
public static void main (String [] args){
Carro carro1 = new Carro("branca","fiat","palio");
Carro carro2 = new Carro("branca","fiat","palio");
Carro carro3 = new Carro("branca","fiat","palio");
Carro carro4 = new Carro("branca","fiat","palio");
Carro carro5 = new Carro("branca","fiat","palio");
//case01
System.out.println(carro1 == carro2); //false
//case02
System.out.println(carro1.equals(carro2)); //true
System.out.println(carro1.equals(carro3)); //true
System.out.println(carro1.equals(carro4)); //true
System.out.println(carro1.equals(carro5)); //true
//case03
Carro carro6 = carro1; // não é um novo carro, mas sim, uma referência ao mesmo carro
System.out.println(carro6 == carro1); //??
System.out.println(carro6.equals(carro1)); //??
}
}
Agora mesmo sendo objetos diferentes, eles são considerados idênticos diante das características.
Hora da verdade
Com base no cenário acima, como você implementaria a classe Carro de forma que uma fábrica de automóveis tivesse controle de cada veículo fabricado individualmente mesmo onde os mesmos pudessem ter a mesma cor, marca e modelo ?
O que faria um veículo ser único no mundo real ?
O que precisamos compreender é que: enquanto o
==
compara referência de objetos, o método equals
compara características. Logo se duas variáveis apontam para um mesmo objeto ==
logo ao usar equals
será true
.Referências