HashSet

[code]import java.util.*;
public class WrappedString {
private String s;
public WrappedString(String s) {
this.s = s;
}
public static void main(String[] args) {
HashSet hs = new HashSet();
WrappedString ws1 = new WrappedString(“aaa”);
WrappedString ws2 = new WrappedString(“aaa”);
WrappedString ws3 = new WrappedString(“aaa”);
WrappedString ws4 = new WrappedString(“aaa”);
hs.add(ws1);//1
hs.add(ws2);//2
hs.add(ws3);//3
hs.add(ws4);//4
System.out.println(hs.size()); //IMPRIME 4

	String s1 = new String("aaa");
	String s2 = new String("aaa");
	String s3 = new String("aaa");
	hs.add(s1);//5
	hs.add(s2);//não add
	hs.add(s3);//não add			
	System.out.println(hs.size());//IMPRIME 5
}	

}[/code]
Alguêm poderia me ajudar com essa já que a inteface Set não permite duplicatas?

Você não redefiniu os métodos “hashCode” e “equals” na sua classe WrappedString.

thingol hashCode e equals não são só para interface Map?

E já que não está redefinido pq eles aceitam duplicatas da Classe mas não do objeto String?

hashCode + equals devem ser redefinidos quando você usa uma classe em:

  • Um HashSet ou LinkedHashSet;
  • Uma chave de um HashMap ou LinkedHashMap.

compareTo deve ser definido quando você usa uma class em:

  • Um TreeSet;
  • Uma chave de um TreeMap.

A história que você ouviu do “Map” está errada - note que a interface Map é implementada tanto por HashMap e LinkedHashMap (que exigem hashCode + equals) quanto por TreeMap (que exige compareTo ou um objeto Comparator).

Em caso de dúvida, sempre consulte a documentação.

A classe String redefiniu os métodos hashCode e equals, enquanto sua classe, que deriva diretamente de Object, herdou as implementações dos métodos hashCode e equals de Object, que checam apenas se 2 objetos são os mesmos na memória (não o conteúdo deles).

[quote=thingol]A classe String redefiniu os métodos hashCode e equals, enquanto sua classe, que deriva diretamente de Object, herdou as implementações dos métodos hashCode e equals de Object, que checam apenas se 2 objetos são os mesmos na memória (não o conteúdo deles).
[/quote]

thingol perfeita essa sua explicação. Tinha esquecido do detalhe que String implementa hashcode e equals. Vlw pela força.