Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Equals e ==

Boa tarde pessoal, tudo bem?

Caso eu queria comparar duas contas apenas pelo número da conta, para determinar se elas são iguais, existe diferença entre essas duas maneiras?

if(conta.equals(conta2)) {
            System.out.println("Contas Iguais");
        } else {
            System.out.println("Contas Diferentes");
        }

OU

if(conta.getNumero() == conta2.getNumero()) {
            System.out.println("Contas Iguais");
        } else {
            System.out.println("Contas Diferentes");
        }
5 respostas

Boa tarde, Caio! Tudo certo? =)

Você chegou a rodar os dois códigos? Pergunto pois acredito que o primeiro resulte num false, mas o segundo pode ser true...

A ideia do equals() é que ele vai verificar a igualdade em vários atributos, até mesmo na referência do objeto. Quando você faz conta.getNumero() == conta2.getNumero(), você está deixando explicito em quais campos você quer realizar a verificação!

Uma opção ainda é sobreescrever o método equals() para sua regra e, para isso, o próprio Eclipse te ajuda! Basta digital CTRL + 3 e, em seguida, equals, com um "enter".

O "wizard" do Eclipse vai perguntar quais campos são importantes para você fazer a diferenciação. Escolhe que é o número da conta, e ele vai gerar o método equals() para você! =)

Espero ter ajudado, mas qualquer dúvida não deixe de postar por aqui para que possamos continuar ajudando-o!

Abraço e bons estudos,

Fábio

Achei isso, espero que ajude

String é um objeto, o metodo equals(Object) vai retornar true se ambas as Strings tiverem o mesmo objeto. O operador == só ira retornar true se ambas referencias de String apontarem para a mesma referencia do objeto.

Quando criamos uma String de forma literal é criado um pool de Strings, quando criamos uma outra String literal com o mesmo valor a JVM procura se ja existe uma String com esse mesmo valor no pool de Strings, caso exista, faz sua variável apontar para o mesmo endereço de memória. Por este motivo, quando você testa a igualdade das variáveis a e b através do "==", ela retorna true.

String a = "abc"; //pool de string

String b = "abc"; /ja existe uma string com o mesmo conteúdo no pool, vai para a mesma referencia na memória/ String c = "dda"; //vai para uma nova referencia de memoria pois não existe no pool

Se você criar strings assim, você está criando um novo objeto em memória e se testar a igualdade das variáveis a e d com "==", ela retornará false, pois não apontam para o mesmo lugar na memória.

String d = new String("abc"); //Cria um novo objeto na memoria

String a = "abc";

String b = "abc";

String c = "dda";

String d = new String("abc");

a==b = true

a==c = false

a==d = false

a.equals(d) = true

Fala Fábio!

Então, eu terminei que esqueci de por meu equals Override aqui:

Esse é meu equals da classe conta:

@Override
    public boolean equals(Object obj) {
        Conta outraConta = (Conta) obj;
        if (this.numero == outraConta.numero && this.nome == outraConta.nome) {
            return true;        
        } else {
            return false;
        }

    }

Esse é meu main:

public class Teste {



    public static void main(String[] args) {
        Conta conta = new ContaCorrente();
        conta.setNumero(123456);
        Conta conta2 = new ContaCorrente();
        conta2.setNumero(123456);
        conta.nome = "Caio";
        conta2.nome = "Caios";

        System.out.println(conta.nome);
        System.out.println(conta2.nome);

        if(conta.equals(conta2)) {
            System.out.println("Contas Iguais");
        } else {
            System.out.println("Contas Diferentes");
        }



    }
}

Tá funcionando tranquilo, a minha duvida era apenas se caso minha regra de negócio fosse apenas comparar o número da conta para saber se é a mesma conta, eu fizesse o seguinte trecho:

if(conta.getNumero() == conta2.getNumero()) {
            System.out.println("Contas Iguais");
        } else {
            System.out.println("Contas Diferentes");
        }

No lugar deste:

if(conta.equals(conta2)) {
            System.out.println("Contas Iguais");
        } else {
            System.out.println("Contas Diferentes");
        }

Considerando que o meu equals Override seria esse no caso:

@Override
    public boolean equals(Object obj) {
        Conta outraConta = (Conta) obj;
        return this.numero == outraConta.numero;

    }

E aqui ambos funcionaram bem, não teve diferença no resultado como você tinha suspeitado.

Valeu, abraços!

Ah Fábio, outra coisa!

Essa dica do ctrl+3 e gerar o equals me economizou um TEMPO absurdo haha.

Obrigado denovo!

solução!

Caio,

Que bom que o atalho ajudou, a ideia é essa! Rs... =D

Respondendo sua pergunta, então... Sobreescrevendo o método equals() para comparar apenas o número, você não teria diferença entre fazer o if() ou chamando o método, sacou? Se a regra para considerar dois objetos iguais é apenas o número, acho que seria interessante você usar o equals() ao invés do ==. =)

Espero ter ajudado, novamente! Mas se ainda estiver com alguma dúvida, não deixa de postar por aqui!

Abraço e bons estudos,

Fábio