1
resposta

[Dúvida] Dúvida

no minuto 11:40 o professor fala que agora vamos tomar um grande susto, pois o turini não está matriculado, mas não faz sentido ele ter falado isso, pois a referencia turini não foi utilizada no método javaColecoes.matricula(turini), se tivesse sido utilizada ia dá true o que para mim está correto. Agora o que realmente não faz sentido é por que ao alterarmos para List o atributo aluno o resultado vai da true? E também eu gostaria de saber para que eu vou usar o hashCode nesse caso, se vai "arrumar" uma coisa que já está certa?

1 resposta

Olá Vitor, tudo bem com você? Espero que sim...

Bom, vamos abstrair sua dúvida em 3 partes:

  • A referencia turini não foi utilizada no método javaColecoes.matricula(turini), se tivesse sido utilizada ia dá true o que para mim está correto

E de fato você esta certo, se tivesse sido usado a mesma referência ele teria retornado true, uma vez que eles apontam para o mesmo objeto, entretanto o professor queria mostrar a diferença entre ser igual e ser mesmo o objeto.

  • Por que ao alterarmos para List o atributo aluno o resultado vai da true?

Isso acontece porque internamente, ou seja, "por debaixo dos panos", a classe List utiliza apenas o método equals para comparar dois objetos. E na vida real é mais complicado, já parou para pensar quantos Vítor Bruno Toscano Ferreira existem no Brasil? Eu já, rsrsrs são 17, e Lucas da Silva Ferreira são mais de 3.476.

Fonte: https://portaldatransparencia.gov.br/pessoa-fisica/busca/lista

É claro que isso é apenas um valor aproximado, podem haver mais ou menos, o ponto que eu quero mostrar é, que devemos entender como funciona para sabermos como aplicar.

  • Para que eu vou usar o hashCode nesse caso, se vai "arrumar" uma coisa que já está certa?

Nesse caso, não faria muita diferença, mas imagine que a Receita Federal precise realizar uma comparação, ou uma busca no banco de dados que contém todos os CPFs do Brasil, seria muito, muito, muito, mas muito ineficiente, eu já falei muito? muito mesmo ineficiente se ela aplicasse essa pesquisa com o método equals dentro de uma lista.

Entretanto se nesse mesmo cenário fosse utilizado um set e a busca fosse feita com a implementação do hashCode, o tempo seria absurdamente menor.

Eis que podemos provar isso com o código abaixo:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

public class TestaPerformaceAdicaoEBusca {
    public static void main(String[] args) {
        // Collection<Integer> numerosArrayList = new HashSet<>();
        Collection<Integer> numerosArrayList = new ArrayList<>();
        long tempoInicial = System.currentTimeMillis();

        for (int i = 0; i < 180000; i++) {
            numerosArrayList.add(i);
        }

        for (Integer numero : numerosArrayList) {
            numerosArrayList.contains(numero);
        }  
        long tempoFinal = System.currentTimeMillis();

        System.out.println("Tempo gasto para para inserir elementos na ArrayList: " + (tempoFinal-tempoInicial) + "ms");
    }
}

Faz o teste e depois me fala o que achou. Basta trocar as linhas comentadas.

Espero ter ajudado a esclarecer sua dúvida. Se tiver mais alguma questão, é só perguntar!

Uma ótima semana e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado . Bons Estudos