Desafio aos feras em java básico

Olá

O que imprime o código abaixo:

[code]
public static void main(String[] args) {
Map m = new IdentityHashMap();
m.put(“a”, 1);
m.put(“a”, 2);
m.put(“a”, 3);

System.out.println(new HashSet(m.entrySet()).size());
}[/code]

Opções:
a) 3
b) 0
c) 1
d) null
e) Nenhuma das anteriores

Escolha uma opção e explique porque

[]s
Luca

Imprime 1.

Motivos?

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”).

Olá

Pô, tinha que ser você a responder, um pós doutorado em todas as picuinhas, maneirices e caraminholas do Java (e do Ruby também)?

Tirou a graça seu sabudo… rs.

Eu aqui achava que a mais votada seria que imprime 3. Mas admito que alguns ainda iam chutar outras coisas.

Parabéns!!!

[]s
Luca

Boa noite colegas !

opção c) 1

Porque as chaves são iguais ? Logo só substitui os valores sem criar novos.

[]s

PS - Como sempre posso ter falado uma grande bobagem. rsrs

Desculpem… não tinha visto que já tinha sido respondido e explicado

esse exercicio é de simulado para SCJP ???

Otima solução !!

Olá

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.

[]s
Luca

entendi … obrigado

[quote=Maurício Linhares]Imprime 1.

Motivos?

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

Não, no contrato de Map duas chaves são iguais se elas são equals, não se as referências são iguais.

[code=java]public static void main(String[] args) {
Map m = new IdentityHashMap();
m.put(“a”, 1);
m.put( new String( “a” ) , 2);
m.put(“a”, 3);

System.out.println(new HashSet(m.entrySet()).size());
}[/code]

Esse código vai imprimir 2, mas se você colocar um HashMap ele vai imprimir 1.

[quote=danielbussade][quote=Maurício Linhares]Imprime 1.

Motivos?

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.

[quote=Luca]Olá

Pô, tinha que ser você a responder, um pós doutorado em todas as picuinhas, maneirices e caraminholas do Java (e do Ruby também)?

Tirou a graça seu sabudo… rs.

Eu aqui achava que a mais votada seria que imprime 3. Mas admito que alguns ainda iam chutar outras coisas.

Parabéns!!!

[]s
Luca[/quote]

Foi mal Luca, tava num momento de insônia e terminei caindo no seu tópico :lol:

Próxima vez eu espero um pouco mais :slight_smile:

Não, no contrato de Map duas chaves são iguais se elas são equals, não se as referências são iguais.

[code=java]public static void main(String[] args) {
Map m = new IdentityHashMap();
m.put(“a”, 1);
m.put( new String( “a” ) , 2);
m.put(“a”, 3);

System.out.println(new HashSet(m.entrySet()).size());
}[/code]

Esse código vai imprimir 2, mas se você colocar um HashMap ele vai imprimir 1.[/quote]

Obrigado pela explicação Maurício e Cássio, agora entendi.

Att