cami-la / collections-java-api-2023

Este repositório é referente ao curso "Collection Framework API Java" e é uma valiosa contribuição para a comunidade de desenvolvedores Java, fornecendo exemplos práticos e recursos educacionais relacionados à poderosa API de coleções da linguagem Java.
https://web.dio.me/course/conhecendo-collections-java/learning/c5d6f4e1-6d05-4eea-93d8-d292c708999f
874 stars 636 forks source link

Duvida quanto a o que realmente está acontecendo no exemplo pesquisa por titulo #1

Open MedeirosJoel opened 11 months ago

MedeirosJoel commented 11 months ago

Olá Camila, estou realizando o seu curso e estudando aqui e gostaria se possível de uma melhor explicação do que está acontecendo na linha abaixo: https://github.com/cami-la/collections-java-api-2023/blob/cf51d96e0b6376493b6b19d85390914f25ba2965/src/main/java/list/Pesquisa/CatalogoLivros.java#L51C1-L51C30

O que está acontecendo é a cópia do objeto ou a indicação de um ponteiro? Pesquisei um pouco e não tive boas conclusões. Desde já agradecido.

cami-la commented 11 months ago

Oi, Joel. Tudo certinho?

Então, no Java não temos o conceito de ponteiro e sim de referência do objeto.

Quando atribuímos livroPorTitulo = l;, estamos simplesmente fazendo com que a referência livroPorTitulo aponte para o mesmo objeto que a referência l. Aí, após o loop, livroPorTitulo conterá a referência para o objeto Livro que possui o título correspondente, se encontrado, ou será nulo se nenhum título correspondente for encontrado.

Mas não ṕrecisa se preocupar tanto com isso, no Java temos "garbage collection", que cuida de desalocar automaticamente a memória ocupada por objetos que não estão mais sendo referenciados.

Logo, se você modificar o objeto livroPorTitulo, as mudanças também serão refletidas na referência l e vice-versa, porque ambas as referências apontam para o mesmo objeto na memória.

Tenta fazer o teste:

  public Livro pesquisarPorTitulo(String titulo) {
    Livro livroPorTitulo = null;
    if (!livroList.isEmpty()) {
      for (Livro l : livroList) {
        if (l.getTitulo().equalsIgnoreCase(titulo)) {
          livroPorTitulo = l;

          System.out.println("Antes de modificar: " + l.getAutor());
          System.out.println("Antes de modificar: " + livroPorTitulo.getAutor());

          livroPorTitulo.setAutor("Autor modificado aqui em livroPorTitulo, também modifica em l.");

          System.out.println("Autor de l " + l.getAutor());
          System.out.println("Autor de livroPorTitulo " + livroPorTitulo.getAutor());
          break;
        }
      }
      return livroPorTitulo;
    } else {
      throw new RuntimeException("A lista está vazia!");
    }
  }

Te indico esse tópico aqui no stackoverflow: https://pt.stackoverflow.com/questions/56470/qual-a-diferen%C3%A7a-entre-ponteiro-e-refer%C3%AAncia

Espero ter ajudado! (: Bons estudos para nós!