Pode um array java ser usado como uma chave HashMap?

Se a chave de um HashMap é uma matriz de string:

HashMap pathMap; 

Você pode acessar o mapa usando uma matriz de strings recém-criada ou precisa ser o mesmo object String []?

 pathMap = new HashMap(new String[] { "korey", "docs" }, "/home/korey/docs"); String path = pathMap.get(new String[] { "korey", "docs" }); 

Terá que ser o mesmo object. Um HashMap compara chaves usando equals() e duas matrizes em Java são iguais apenas se forem o mesmo object.

Se você quer igualdade de valores, então escreva sua própria class de contêiner que envolve um String[] e fornece a semântica apropriada para equals() e hashCode() . Nesse caso, seria melhor tornar o contêiner imutável, já que alterar o código hash de um object atrapalha as classs de contêiner baseadas em hash.

EDITAR

Como outros apontaram, List tem a semântica que você parece querer para um object contêiner. Então você poderia fazer algo assim:

 HashMap, String> pathMap; pathMap.put( // unmodifiable so key cannot change hash code Collections.unmodifiableList(Arrays.asList("korey", "docs")), "/home/korey/docs" ); // later: String dir = pathMap.get(Arrays.asList("korey", "docs")); 

Não, mas você pode usar List que funcionará como você espera!

Ted Hopp está certo, ele terá que ser o mesmo object

para informações, veja este exemplo

 public static void main(String[] args) { HashMap pathMap; pathMap = new HashMap(); String[] data = new String[] { "korey", "docs" }; pathMap.put(data, "/home/korey/docs"); String path = pathMap.get(data); System.out.println(path); } } 

Quando você executar acima, ele imprimirá “docs”.

Você não pode usar um Java Array simples como uma chave em um HashMap . (Bem, você pode, mas não vai funcionar como esperado).

Mas você pode escrever uma class wrapper que tenha uma referência ao Array e que também substitua hashCode() e equals() .

Arrays em Java usam o hashCode() do Object e não o sobrescrevem (a mesma coisa com equals() e toString() ). Portanto, não, você não pode usar arrays como uma chave hashmap.

Na maioria dos casos, onde as Strings dentro de sua matriz não são patológicas e não incluem vírgulas seguidas por um espaço, você pode usar Arrays.toString() como uma chave exclusiva. ou seja, o seu Map seria um Map . E o get / put para um array myKeys[] seria

 T t = myMap.get(Arrays.toString(myKeys)); myMap.put(Arrays.toString(myKeys), myT); 

Obviamente, você poderia colocar algum código wrapper, se desejar.

Um bom efeito colateral é que sua chave agora é imutável. É claro que, se você mudar o array myKeys e depois tentar um get() , você não o encontrará.

Hashing de Strings é altamente otimizado. Então, meu palpite é que essa solução, embora pareça um pouco lenta e desajeitada, será mais rápida e eficiente em termos de memory (menos alocações de objects) do que a solução @Ted Hopp usando uma Lista imutável. Basta pensar se o Arrays.toString() é exclusivo para suas chaves. Se não, ou se houver alguma dúvida, (por exemplo, o String [] vem da input do usuário) use a Lista.