[SCJP] HashSet e remove()

Para quem está estudando para exame SCJP ou gosta de resolver o problema…qual é a saida dos codigos abaixo? :

[code]class KeyMaster {
public int i;
public KeyMaster(int i) { this.i = i; }
public boolean equals(Object o) { return i == ((KeyMaster)o).i; }
public int hashCode() { return i; }
}

public class Questao147 {

public static void main(String[] args) {
	Set<KeyMaster> set = new HashSet<KeyMaster>();
	KeyMaster k1 = new KeyMaster(1);
	KeyMaster k2 = new KeyMaster(2);
	set.add(k1); set.add(k1);
	set.add(k2); set.add(k2);
	
	System.out.println(set.size() + ":");
	k2.i = 1;
	
	System.out.println(set.size() + ":");
	set.remove(k1);
	
	System.out.println(set.size() + ":");
	set.remove(k2);
	
	System.out.println(set.size());		
}

}[/code]

2:
2:
1:
1

[quote=javadev]2:
2:
1:
1[/quote]

blz, mas pq na segunda chamada ao metodo remove(k2) ele nao conseguiu remover o elemento?

blz, mas pq na segunda chamada ao metodo remove(k2) ele nao conseguiu remover o elemento?[/quote]

A instrução (k2.i = 1) modificou o valor primitivo variavel “i”. Quando set.remove(k2) for executar, ele ignora porque ele achou que ja deletou o k# cujo i = 1;

Se a linha (k2.i = 1) nao for executada, a saida seria : 2:2:1:0

entao o set guarda tipo um historico de suas operações? pra por exemplo melhorar o desempenho ?