import java.util.*;
public class WrappedString {
private String s;
public WrappedString(String s) {
this.s = s;
}
public static void main(String[] args) {
HashSet<Object> hs = new HashSet<Object>();
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
}
}
HashSet
5 Respostas
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).
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).
thingol perfeita essa sua explicação. Tinha esquecido do detalhe que String implementa hashcode e equals. Vlw pela força.