DEV Community

Cover image for O Método Equals em Java
Diego Henrique
Diego Henrique

Posted on

O Método Equals em Java

Se você tem ou ja teve contato com alguma linguagem de programação, sabe que quando queremos comparar valores de variaveis diferentes, utilizamos uma estrutura condicional e um operador, como no exemplo abaixo onde estou verificando se o conteudo da variavel x é igual ao conteudo da variavel y, feito em Python:

variavel1 = "Diego"
variavel2 = "Diego"
if variavel1 == variavel2:
  return true
return false

Enter fullscreen mode Exit fullscreen mode

Fazendo uma breve analise sobre esté codigo, podemos afirmar que o retorno dessa função será true, logo que o conteudo de ambas variaveis, são identicos, e essa afirmação está correta.

Vamos analisar de forma técnica como isso está acontecendo.

Ao declararmos uma váriavel em python, o que está acontecendo é que estamos criando um objeto String na memoria e armazendo o conteudo informado pelo programador, por padrão precisamos definir o nome dessa variavel, que vai ser utilizado como forma de caminho na memoria, na ilustração abaixo, podemos compreender melhor esse comportamento.

Image description

Porém, quando tentamos repetir o mesmo código feito anteriormente, mas dessa vez em Java, nos deparamos com um comportamento estranho:


  String variavel1 = new String("hello");
  String variavel2 = new String("hello");
  if (str1 == str2) {
      return true;
  }
  return false;
}

Enter fullscreen mode Exit fullscreen mode

O motivo pela qual afirmei ser estranho, é que o retorno dessa comparação é false!

Ue mas como assim ? ambas variaveis tem o mesmo conteudo, correto? Sim, está correto, porém, em Java o comportamento informado anteriomente sobre como nosso objeto é armazenado na memoria, ocorre de maneira diferente, vamos entender.

Como vimos em Python, nossa variavel está diretamente relacionada com o conteudo na memoria, então quando chamamos o nome da variavel na nossa IDE, estamos acessando diretamente o conteudo na memoria.

O que é diferente em Java, pois quando chamamos a nossa variavel, o que está acontecendo por trás dos panos, é que estamos chamando um valor de refererencia no qual o nosso objeto está armazenado na memoria, segue a ilustração:

Image description

Esse é o principal motivo pela qual nossa comparação retornou false, isso porque, o que estamos comparando na realidade, não é o conteudo das variaveis, mas sim o valores de referencia na memoria.

Vamos utilizar um exemplo mais simples para compreendermos melhor esses comportamentos.

No caso vamos imaginar que um entregador precisa entregar um produto para um determinado cliente e para isso precise passar por um tunel, entenda esse tunel como nossa variavel.

Primeiramente vamos simular esse exemplo utilizando como base o Python:

O entregador tem um tunel a sua frente, o destino final desse tunel, tem exatamente a casa do nosso cliente, logo conseguimos acessar a casa do cliente e entregar seu produto.

Agora usando como Java como base para o nosso exemplo:

Agora o nosso entregador está na mesma situação anterior, porém o tunel, não tem exatamente o endereço do nosso cliente, mas sim o endereço da sua cidade, logo para acessarmos a casa do nosso cliente, primeiramente temos que passar pela cidade do cliente que contém o endereço correto de sua casa, logo podemos entregar seu produto.

Espero que dessa forma, tenha compreendido melhor a diferença entre essas duas.

Certo, mas como podemos ajudar o nosso entregador, ter acesso direto a casa do nosso cliente? É aqui que nosso metodo "equals" entra para nos ajudar nessa missão!

O metodo equals do Java, é um metodo booleano que recebe uma String em seu parametro, a funcionalidade dele é comparar o valor do objeto no qual está sendo chamado com o valor que está recebendo em seu parametro.

Note que o metodo equals não está comparando com o valor de referência, mas sim com o valor do conteudo do objeto

public class Main {
    public static void main(String[] args) {
        String variavel = new String("Diego");
        System.out.println(variavel.equals("Diego"));

// Nesse código, o método equals está acessando o valor"Diego" da variável e comparando se é igual ao "Diego" que está sendo passado como parâmetro. Logo seu retorno é true!
    }
}


Enter fullscreen mode Exit fullscreen mode

Entenda nosso metodo "equals" como um atalho para nosso entregador, dessa forma, no final desse atalho, temos a casa do seu cliente.

Agora vamos refatorar nosso codigo anterior em Java:

  String str1 = new String("hello");
  String str2 = new String("hello");
  if (str1.equals(str2)) {
      return true;
  }
  return false;
}


Enter fullscreen mode Exit fullscreen mode

Dessa forma, temos o nosso resultado "true" esperado, e finalmente conseguimos finalizar esse código corretamento.

Observação:

Atualmente em Java, não precisamos fazer a instanciação de uma variavel de tipo String, basta apenas definir o tipo da variavel e o seu valor, dessa forma temos um comportamento um pouco diferente do que abordei no artigo, envolvendo POOL DE STRINGS, que psso abordar em outro artigo. Mas é impontante ressaltar que mesmo assim, ainda é necessário utilzar equals pelos mesmos motivos anteriores.


  private static boolean teste() {
      String str1 = "hello";
      String str2 = "hello";
      return str1.equals(str2);
}


Enter fullscreen mode Exit fullscreen mode

Conclusão:

A forma em que acessamos Strings em Java é um pouco diferente de outras linguagens, dado que nossa variavel não é o caminho direto para o objeto em memoria, mas sim ao um valor de referencia, utilizado para acessar o objeto em si.

Fontes:

(https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-)

(https://codegym.cc/pt/quests/lectures/pt.questsyntaxpro.level07.lecture02)

Top comments (2)

Collapse
 
egotting profile image
henrico

obg professor

Collapse
 
raposy profile image
Kaminski

Muito bom amor!!! Ajudou muito