Oi,
1 - eu tenho 3 métodos que preenchem um HashMap e retorna-o.
public Map<String, String> getMap() {...}
public Map<String, List<String>> getLinkMap() {...}
public Map<String, String[]> getArrayMap() {...}
O Java tem muitas implementações de Map:
http://download.oracle.com/javase/6/docs/api/java/util/Map.html
De todas estas implementações qual é a melhor implementação para satisfazer os seguintes requisitos?
- Demora pouco tempo a construir o Map e gasta pouca memória.
- O Map não é persistente.
2 - Qual a função que devo preferir (public Map<String, List> getLinkMap() {…} ou public Map<String, String[]> getArrayMap() {…})?
Ou seja estou a referir-me em usar um List dentro do Map, ou um String[]. Não sei qual destas é a melhor para se implementar.
Eu julgo que com o List gasto mais memória mas não preciso de andar a criar arrays e a validar se têm tamanho certo, no entanto, se calhar, com o String[] gasto menos memória e é mais rápido. Qual a vossa opinião?
3 - Existe uma outra forma mais rápida e que use pouca memória de se usar um mapeamento <chave, valor>?
Se você conseguir deixar a chave pouco dispersa e numérica, a forma mais rápida e eficiente é um array simples.
Agora, a menos que seu map seja realmente gigantesco, você não terá problemas com memória ou performance no map em si. É muito mais provável que o problema esteja nos objetos que você põe dentro do map.
Então quer dizer que não existe diferença a nível de performance entre um HashMap, WeakHashMap e um LinkedHashMap, a nível de performance? Se assim fosse, qual a razão de existirem estas 3 implementações?
A diferença não é só performance:
- O HashMap é a implementação geralmente mais rápida. Mas não garante a ordem dos elementos;
- O LinkedHashMap garante que a ordem dos elementos será mantida igual a de inserção. Ocupa um pouco mais de memória que o HashMap também;
- O TreeMap gera um mapa ordenado, de acordo com a chave. Também gera um pouco de overhead de memória, mas dependendo do caso pode ser mais rápido que o próprio HashMap;
- O WeakHashMap usa WeakReferences. Isso significa que elementos serão retirados do mapa (e da memória), caso o mapa seja o único a referencia-los. É como se as referências dele não contassem para fins de garbage collection.