~[Duvida] Questão 10 TestKiller

5 respostas
GabrielCardelli

Galera to com uma duvida aqui cruel T_T.

A Questão 10 do test killer é a seguinte

Question 10 Given: 11. public class Person { 12. private name; 13. public Person(String name) { 14. this.name = name; 15. } 16. public int hashCode() { 17. return 420; 18. } 19. } Which is true? A. The time to find the value from HashMap with a Person key depends on the size of the map. B. Deleting a Person key from a HashMap will delete all map entries for all keys of type Person. C. Inserting a second Person object into a HashSet will cause the first Person object to be removed as a duplicate. D. The time to determine whether a Person object is contained in a HashSet is constant and does NOT depend on the size of the map.

Por ele ta implementando hashcode e retornando 420 todos os objetos são iguais
Então a resposta seria C…

Mais lá ta dizendo que é a 'A" alguem pode explicar porquew?

Abraço e obrigado desde já;;;

5 Respostas

Lavieri

1° vamos entender HashMaps… o que acontece ?? … um HashMap é como se contivesse container separada para cada HashMap

então quando vc adcionar um Key, a um HashMap, ele guarda o objeto num container identificado pelo número do HashCode…

Então suponha que vc tenha 6 objetos diferentes, porem alguns deles tem o mesmo hashCode, mais os objetos são diferentes, e portanto equals retorna falso entre eles…

Object1, hash = 3
Object2, hash = 1
Object3, hash = 2
Object4, hash = 2
Object5, hash = 1
Object6, hash = 3

Quando vc os adicona como Key de um hashMap… o que vai acontecer… é que o HashMap, vai dividir eles em 3 containers… de acordo com os hashMap

os objetos 2 e 5 vão para o container de 1
os objetos 3 e 4 vão para o container de 2
os objetos 1 e 6 vão para o conteiner de 3

esse é o mecanismo… que uma Collection Hash usa… o que ocorre, é que fica mais rapido encontrar, pois quando vc tenta buscar a key 6, ele verifica o hashCode, ve que é 3… vai direto no conteiner 3… e la dentro ele testa entre o 1, e o 6, econtrando com 2 testes, em vez, de testar entre 6 objetos…

no xemplo mostrado nesse exercicio… o HashCode foi sobrescrito, e é constante… ou seja… o conteiner é único para qualquer objeto, a funcionalidade do HashCode para o HashMap é anulado, e todos os objetos vão ser jogando dentro de um único container… porem, se os objetos forem diferentes, ele não vai excluir um previamente existente, ele so vai manter no mesmo container…

portanto, se o hashMap é unico (420) o tempo para encontrar uma Key Person, vai demorar sim, de acordo com a quantidade de Persons no HashMap, isso pq todos os objetos vão estar dentro de um único container, sendo assim tera que xecar entre todos os objetos…

a letra C afirma que ao incluir um, o outro sera exlucido, isso não é verdade, pois o hashCode pode ter sido sobrescrito com valor 420 para todos, porem a hashCode só identifica o conteiner, depois de encontrar o conteiner, a busca será entre todos os objetos dentro dele, através de teste de .equals() … sendo assim, uma key não vai excluir a outra

desculpa se fui extenso

Lavieri

um exemplo facil... é assim... imagine uma classe Nome ... onde seu hash fosse dado pela inicial, assim algo assim

public clas Nome {
   private String nome;
   public Nome(String nome) { this.nome = nome; }

   //serão iguais se tiverem o mesmo nome
   public boolean equals(Object o) {
       return o instanceof Nome && nome.equals(((Nome)o).nome);
   }
  
   //o hash é definido pela inicial...
   public int hashCode() {
      return nome.toLowerCase().charAt(0);
   }
}

se eu pegar um HashMap, quando faço

Map<Nome,String> meuHash = new HashMap<Nome,String>();

map.put(new Nome("João"), "jãojão");
map.put(new Nome("Jose"), "zeze");
map.put(new Nome("Marcos"), "mama");
map.put(new Nome("Eduardo"), "dudu");

o que ocorre ai... é que João e José estão em um mesmo conteiner, pois os 2 inciam por "J", c vc fizer uma busca por "Jose" ela é relativamente rapida, pois vai procurar só dentro do conteiner "J" que só contem "João" e "Jose", não vai testar marcos ou eduardo... e assim ele acha facil o apelido"zeze"

porem a substituição so sera feita quando os objetos forem iguais

map.put(new Nome("Jose"), "zezim"); //agora sim há substituição

agora sim, o antigo jose foi subistituido pelo novo

espero q de pra entender

GabrielCardelli

Valeu mano deu sim :smiley:

vou estudar o assunto.

Abraço e obrg

G

Mandou bem na explicação!

taaqui

Bela explicação, realmente gostei muito.

Criado 22 de maio de 2009
Ultima resposta 23 de mai. de 2009
Respostas 5
Participantes 4