O Método Equals em Java
Tags: webdev, beginners, programming, java
Published: 2024-02-07 18:15:02

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

```
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cgcysuorf9z4k50rnau7.png)

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;
}

```

## **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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ab6uuofrmwa126doagl.png)

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!
    }
}


```
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;
}


```

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);
}


```

## **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)