Vamos ao mais simples primeiro:
[…]vou fazer uma outra pergunta, pois antes de inserir um objeto no HasMap, preciso saber se o mesmo já existe ?[…]
Primeiro de tudo, a suposta restrição à repetição se aplica às chaves, e não aos valores a elas associados. Mas essa “restrição”, não é bem uma restrição, vc não é
obrigado a verificar se em um HashMap já existe uma chave igual a que vc quer inserir. O que acontece é o seguinte: Se vc insere um par (key1, val1) em um HashTable, no qual já exista um par (key2, val2), de tal forma que “
key1.equals(key2) == true”, o método put(Object, Object) do HashMap vai trocar o valor do seu antigo par (key2, val2), deixando-o agora como (key2, val1) e ainda vai te retornar o val2, que é o valor que foi
substituído. Ou seja, o put(bject key, Object val) vai inserir no HashMap o valor
val associado a chave
key. Se já houver na tabela uma chave que seja igual a
key, o valor associado a esta chave será substituído por
val e o valor antigo será retornado. Caso não exista no HashMap nenhuma chave igual a
key, o par (
key,
value) será inserido e o put vai retornar null.
Perceba então que uma forma de saber,
a posteriori, se já existe uma determinada chave no HashMap, seria simplesmente dar um put e analisar o retorno: Se for
null, não tinha nenhuma chave daquela, caso contrário, já tinha.
Alternativamente, vc pode verificar a existência de uma chave
antes de inserí-la, utilizando o método containsKey(Object key) que te retorna
true caso a chave
key exista no HashMap, e
false caso contrário. Analogamente, temos o método containsValue(Object val), que analisa a existência de um valor
val no HashMap.
.
[…]mas gerou uma duvida, pois para recuperar
um usuário eu preciso dessa chave, mas no meu caso eu quero fazer um for e imprimir todos usuários, como
vou ter essa chave de cada usuário para imprimi-los?[…]
Aí já complica mais um pouquinho… Existe uma interface na API Java que se chama “Set”, que representa uma coleção (Collection) de elementos não repetidos, isto é, sejam quaisquer
elem1 e
elem2 pertencentes a um Set
mySet,
elem1.equals(
elem2) sempre é falso.
Tô falando sobre o Set porque existem dois métodos da classe HashMap que retornam um Set: keySet() e entrySet().
O método keySet() de um HashMap te retorna um Set que tem como elementos as chaves desse HashMap. Tendo um Set “nas mãos” vc pode iterar sobre as chaves através de um Iterator(retornado pelo método iterator() da interface Set) ou de um array simples(retornado pelos métodos toArray() e toArray(Object[]) ). É importante citar alguns poréns que eu tava lendo na API: 1) Se vc excluir alguma chave no HashMap que originou o Set, tal chave será excluida também do Set, e vice-versa. 2) Os métodos add(Object) e addAll(Collection) da interface Set, não são suportados por um Set obtido através do retorno do método keySet() de um HashMap.
Agora… quanto ao método entrySet(), temos uma pegadinha… Se temos um HashTable que tem, por exemplo, um mapeamento de chaves do tipo String e valores do tipo File, algo como (strKey, fileVal), o Set retornado pelo seu keySet() terá elementos Object que “podem ser convertidos” para String.
Já o entrySet(), faz
quase a mesma coisa que o keySet(): Te retorna um Set com os valores do HashMap, só que não será um Set com Object “conversíveis” para File, neste nosso exemplo… O Set retornado pelo entrySet()
sempre tem elementos do “tipo”
Entry, que é uma interface interna e pública da interface Map. O que isso quer dizer? Quer dizer que, por exemplo, na primeira posição do nosso Set, não teremos um File, e sim um Entry.
A interface Entry representa um mapeamente (chave,valor). Embora pareça uma idiotice retornar um Set de Entry ao invez de, no nosso exemplo, um Set de File, isso faz muito sentido: Lembra que um Set não tem elementos repetidos? Agora, perceba que um HashMap não tem
chaves repetidas, mas duas(ou mais) chaves diferentes podem armazenar valores iguais. Senda assim, se o entrySet() não tem como retornar um Set dos valores contidos em um HashMap, pois não há garantias de que só temos valores diferentes. Daí a jogada do Set de Entry, que garante a unicidade de cada elemento do Set, pois cada mapeamento (chave,valor) no HashMap é único.
O fato do retorno do entrySet() ser um Set de Entry implica que, quando vc for iterar sobre um Set obtdo pela invocação deste método, vc terá que: 1)converter o elemento para Entry(Por que o Set sempre “cospe” seus elementos com usando o tipo Object), 2)invocar o método getValue(), que te retorna um Object referente ao valor do mapeamento (chave,valor), representado pelo Entry, 3)Converter esse Object retornado, no nosso exemplo, em um File.
Ficaria algo assim:
...
HashMap myHashMap = new HashMap();
.../*Suponha que aqui o myHashMap foi alimentado*/
/*Vamos escrever na tela todos os valores armazenados no nosso
HashMap, que são objetos do tipo File, neste exemplo*/
Set values = myHashMap.entrySet();
Iterator myIterator = values.iterator();
System.out.println("Listando arquivos contidos no HashMap myHashMap:");
while(myIterator.hasNext()){
Entry myEntry = (Entry)myIterator.next();
File myFile = (File)myEntry.getValue();
/* De um modo mais abreviado ficaria assim:
File myFile = (File)((Entry)myIterator.next()).getValue()
*/
System.out.println("\t" + myFile.getName());
}
...
É isso, espero ter ajudado!
Qq coisa, pergunte. ok!