Desafio aos feras em java básico

11 respostas
Luca

Olá

O que imprime o código abaixo:
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());
}

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

Escolha uma opção e explique porque

[]s
Luca

11 Respostas

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

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

Zeed01

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

gui_sv

esse exercicio é de simulado para SCJP ???

Otima solução !!

Luca

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

gui_sv

entendi … obrigado

danielbussade

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

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

Mauricio_Linhares

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.

cassio

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

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

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.

Mauricio_Linhares

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

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:

danielbussade

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.

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

Att

Criado 22 de abril de 2008
Ultima resposta 23 de abr. de 2008
Respostas 11
Participantes 6