HashCode + questão

Pessoal,
me matando um poko nos simulados da Kathy, me deparei com um tal de HashCode… alguem pode me dar uma explicação melhor sobre o que é esse método? pra que serve e coisas do tipo?

E aproveitando, a questão 10 do cap 7 é a seguinte:

1. public class X {
2. public static void main(String [] args) {
3. X x = new X();
4. X x2 = m1(x);
5. X x4 = new X();
6. x2 = x4;
7. doComplexStuff();
8. }
9. static X m1(X mx) {
10. mx = new X();
11. return mx;
12. }
13. }
After line 6 runs. how many objects are eligible for garbage collection?
A. 0
B. 1
C. 2
D. 3
E. 4

e sinceramente, fiquei surpreso por saber que a resposta certa é a “b”…
alguem pode me explicar porque? abraço…

Pelo que eu entendi, o primeiro objeto X é descartado assim que é usado como parâmetro na linha 4, pois entra em um outro método onde é retornado um novo objeto X para a antiga variável, deixando o antigo X null… não é isso?

Veremos se posso ajudar…

na linha 3, é criado um novo objeto no heap x.

Na linha 4, chama um método, que passa o valor representando a referência para o objeto x da linha 3( lebre-se, Java não usa ponteiros ), esse método cria um novo objeto(mx e o atribui para a referência x2, ou seja, o objeto ao qual mx faz referência não será escolhido pelo gc, pois x2 se refere a ele.

Na linha 5, é criado um novo objeto, ao qual é atribuido à refeência x4.

Na linha6, a variável x2 faz referência para o mesmo objeto que x4 faz, ou seja, o objeto ao qual x2 fazia referência antes dessa linha, ficou pertido, sem nenhuma variável o referenciando, isso é o suficiente pro gc o recolher( assim que o gc tiver vontade :grin: )…

Lembre-se, quando foi passado a referência x para o método, foi passando uma cópia do valor que faz uma referência a um objeto.
Quando acontece o seguinte:
static X m1(X mx) {
mx = new X();
return mx;
}
mx é esse valor. quando mx=new X(), está criando um novo objeto e atribuindo esse objeto ao parametro, que tinha uma cópia dos bits que referênciavam o objeto de x…Isso não fará com que x referencia esse novo objeto…lembre se( Java não trabalha com ponteiros…)

Espero ter ajudado… :grin:

vamos fazer um exemplo de hashCode:
vamos atribuir a cada letra, um número:Ex. A=1, B=2, C=3, D=4 …
seu método hashCode retornaria um inteiro representando a soma de todos os números dessa string.

Então o nome “ANA” seria representado por 1+ 13 +1=15;

imagine agora, vc ter uma tabela onde são guardados todos os numes, e que essa tabela tenha mais de 5.000.000 de nomes.Para localizar ANA nessa tabela, ela teria que ser olhada posição por posição até encontrar ANA.

Alguns objetos, como o Hashtable e o HashMap, utiliza esse codigo para “guardar” o objeto, no caso, “ANA” em determinada posição, dependendo do resultado retornado pelo método hashCode.
Quando for solicitado para localizar o objeto “ANA”, ele irá direto para o local onde está “ANA”, pois sabe a posição da tabele em que “ANA” está localizada.

Obs: Objetos diferentes “podem” ter o mesmo número de hash.
Objetos iguais “devem” ter o mesmo numero de hash.
É importante saber disso para o exame… :grin: