Uma de collections

a - não compila
b - compila e lança runtime exception
c - roda e imprime 1
d - roda e imprime 10

import java.util.Set;
import java.util.HashSet;

class UmaClasse {
	private static int id;
	public boolean equals (Object o) {
		return true;
	}
	public int hashCode() {
		id++;
		return id;
	}
}

public class TCol3 {
	public static void main(String [] args) {
		Set s = new HashSet();
		for (int i=0; i<10; i++)
			s.add(new UmaClasse());

		System.out.println(s.size());
	}
}

letra d

ok e se eu mudar o hashCode para

	public int hashCode() {
		return 1;
	}

?

Aí retornará 1.(letra c)

correto

correto[/quote]

e se trocar por isso no codigo original?

   public static void main(String [] args) { 
      Set s = new HashSet(); 
	  UmaClasse y = new UmaClasse();
      for (int i=0; i<10; i++){
         s.add(y); 
	     y = null;
	  }
      System.out.println(s.size()); 
   } 

2?

positivo,loucura :stuck_out_tongue:

[quote=“marciolx”]a - não compila
b - compila e lança runtime exception
c - roda e imprime 1
d - roda e imprime 10

[code]
import java.util.Set;
import java.util.HashSet;

class UmaClasse {
private static int id;
public boolean equals (Object o) {
return true;
}
public int hashCode() {
id++;
return id;
}
}

public class TCol3 {
public static void main(String [] args) {
Set s = new HashSet();
for (int i=0; i<10; i++)
s.add(new UmaClasse());

	System.out.println&#40;s.size&#40;&#41;&#41;;
&#125;

}
[/code][/quote]

pessoal…gostaria de uma informação…
estou estudando para a SCJp…e estava analisando este post…
agora estou estudando a substituição dos metodos equals() e hashCode().

Analisando este codigo acima…estava tentando qualificar a implementação feita para esse metodo hasCode…e queria saber se estou certo de que essa nao é uam boa implementação de um método hashCode…(mas acima de tudo válida)…porque para cada instancia criada…da classe “UmaClasse”…ele estara dando um valor de hashCode para cada instancia…sendo qeu eles sempre retornaram true…em seu metodo equals()…portanto , para ficar uma impletamentação melhor… nao deveria gerar o mesmo codigo para todas as instancia s nesse caso ??

Ta certo que essa classe nao possui nenhum outro atributo , fora o atributo statico , digamos para ser um atributo relevante na equivalencia das classes…e consequentemente gerando um metodo de hashCode…em cima desse atributo…

mas desta forma que esta…nao é uma boa né??

se nao for…o que eu estou me confundindo…

Obrigado a todos.

Obrigado.

Cara, o importante dessa questão não é se a implementação dela é boa. É você saber que o HashSet, que não permite a inclusão de dois elementos iguais, vai utilizar o método hashCode para verificar se um determinado objeto já existe na lista. Como o método incrementa uma variável static sempre que é chamado ele vai adicionar todos os 10 elementos porque não haverão duas instâncias com o mesmo hashCode.

Acho que no teste não vão te perguntar qual a melhor maneira de implementar alguma coisa. O objetivo é verificar se você sabe como funciona a linguagem Java e não se é um bom solucionador de problemas.

Me corrigam se eu estiver errado. :slight_smile:

ok, beleza…vc ta certo…!