Bom dia a todos, alguém poderia me explicar a diferença entre os três?
Um Map/Mapa
(ou tabela de símbolos, ou tabela de identificadores, ou array associativo ou dicionário) define uma estrutura de dados que associa chaves com valores. Em Java há uma interface que define esse contrato, ou seja, os métodos que as classes que a implementarão vão precisar fornecer para que a estrutura de dados funcione de forma transparente ao usuário (programador). A implementação de um mapa pode ser feita de várias formas e, em Java, algumas delas já estão prontas. Uma delas é usando tabelas de dispersão, no caso, o HashMap
. O HashMap
garante performance, desde que o método hashCode
herdado de Object
esteja implementado corretamente na classe que será usada para gerar as chaves, mas não garante a ordem de inserção dos pares chave/valor. Se vc precisar saber a ordem em que as chaves foram inseridas, vc pode usar a LinkedHashMap
. Uma outra implementação em Java de um mapa é o TreeMap
, que usa nos bastidores, ao invés de uma tabela de dispersão, uma árvore vermelho-preto e te garante que as chaves estão sempre inseridas em ordem, seguindo uma relação de ordem total estabelecida na interface Comparable
ou por um comparador ao se usar um Comparator
. Existem diversos outros detalhes e a hierarquia de interfaces não é tão simples assim dentro do Java Collections Framework, mas a ideia é essa que estou te passando.
Em relação a Mapping, como vc usou a tag hibernate
na sua postagem, esse termo está relacionado à capacidade (e objetivo) do framework Hibernate em mapear uma classe/pojo/entidade/DTO/TO em uma relação/tabela do SGBD relacional e vice-versa.
Um adendo histórico em relação a implementação dos mapas em Java é que o Java Collections Framework foi implementado na versão 1.2 do Java, chamado de Java 2 e lançado em 1998. Até então, a estrutura de dados disponível para fazer esse tipo de operação era a Hashtable
, que ainda está na plataforma por motivos de compatibilidade, mas que não deve ser usada, pois por padrão é implementada com sincronização, o que derruba a performance em situações que demandam uso intensivo da estrutura de dados.
Segundo a documentação:
As of the Java 2 platform v1.2, this class was retrofitted to implement theMap
interface, making it a member of the Java Collections Framework. Unlike the new collection implementations,Hashtable
is synchronized. If a thread-safe implementation is not needed, it is recommended to useHashMap
in place ofHashtable
. If a thread-safe highly-concurrent implementation is desired, then it is recommended to useConcurrentHashMap
in place ofHashtable
.
O pior é de tudo é que provavelmente, até hoje*
, ainda deve ter professor que ensina esse tipo de coisa como algo que deve ser usado, assim como a classe Vector
que “sofre” dos mesmos “problemas” e deve ser substituída por alguma implementação da interface List
sem sincronização, como ArrayList
por exemplo.
Segundo a documentação:
As of the Java 2 platform v1.2, this class was retrofitted to implement theList
interface, making it a member of the Java Collections Framework. Unlike the new collection implementations,Vector
is synchronized. If a thread-safe implementation is not needed, it is recommended to useArrayList
in place ofVector
.
Em situações em que é necessário haver sincronização nas estruturas de dados, espera-se o uso das implementações contidas no pacote java.util.concurrent
.
* eu digo até hoje, pois onde eu dou aula há 11 anos, eu via quando eu entrei gente ensinando esse tipo de barbaridade sem explicar o contexto. Imagina, anos 2010 e gente falando de coisa dos anos 1990 como se fosse o que deve ser feito.