IdentityHashMap quebra o contrato de Map e diz que duas chaves são iguais se, e apenas se, ref1 == ref2. Como strings declarados de forma literal (os seus “a”'s) vão pro cache de strings da JVM, esses três “a” declarados como literais são na verdade o mesmo objeto, então ambas as referências apontam pro mesmo lugar (e consequentemente “a” == “a” vai ser verdadeiro).
Na primeira inserção, a chave “a” vai ficar com o valor 1 e na sequência ela vai ter o valor alterado, mas não vão ser criadas novas chaves para “a” porque sempre que o “put” acontecer, o map vai perceber que “a” já está lá dentro (quando ele fizer “a” == “a”).
Não, é uma sutileza de uma classe especifíca, que como bem disse o Maurício, tem um comportamento especial diferente das outras similares. Aliás, parece que no Java 7 virá uma irmãzinha dela.
IdentityHashMap quebra o contrato de Map e diz que duas chaves são iguais se, e apenas se, ref1 == ref2. Como strings declarados de forma literal (os seus “a”'s) vão pro cache de strings da JVM, esses três “a” declarados como literais são na verdade o mesmo objeto, então ambas as referências apontam pro mesmo lugar (e consequentemente “a” == “a” vai ser verdadeiro).
Na primeira inserção, a chave “a” vai ficar com o valor 1 e na sequência ela vai ter o valor alterado, mas não vão ser criadas novas chaves para “a” porque sempre que o “put” acontecer, o map vai perceber que “a” já está lá dentro (quando ele fizer “a” == “a”).[/quote]
Olá Maurício, se pudesse me esclarecer uma dúvida, porque IdentityHashMap quebra o contrato de Map, todos os contratos de Map não seriam as chaves sao iguais se, e apenas se, ref1 == ref2?? Ou seja este mesmo programa substituindo IdentityHashMap por HashMap ou HashTable, não imprimiria a mesma coisa??
IdentityHashMap quebra o contrato de Map e diz que duas chaves são iguais se, e apenas se, ref1 == ref2. Como strings declarados de forma literal (os seus “a”'s) vão pro cache de strings da JVM, esses três “a” declarados como literais são na verdade o mesmo objeto, então ambas as referências apontam pro mesmo lugar (e consequentemente “a” == “a” vai ser verdadeiro).
Na primeira inserção, a chave “a” vai ficar com o valor 1 e na sequência ela vai ter o valor alterado, mas não vão ser criadas novas chaves para “a” porque sempre que o “put” acontecer, o map vai perceber que “a” já está lá dentro (quando ele fizer “a” == “a”).[/quote]
Olá Maurício, se pudesse me esclarecer uma dúvida, porque IdentityHashMap quebra o contrato de Map, todos os contratos de Map não seriam as chaves sao iguais se, e apenas se, ref1 == ref2?? Ou seja este mesmo programa substituindo IdentityHashMap por HashMap ou HashTable, não imprimiria a mesma coisa??
Obrigado[/quote]
No caso do contrato inicial do Map, duas chaves são iguais se chaveA.equals(chaveB). Não é levado em consideração o valor das referências.