Maps em Java

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:

  1. O HashMap é a implementação geralmente mais rápida. Mas não garante a ordem dos elementos;
  2. 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;
  3. 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;
  4. 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.

Obrigado pela resposta.