Queria esclarecer que ja abri um tópico parecido mas este é um pouco diferente
o codigo abaixo deveria dar um resultado null pois a chave foi mudada,mas no entanto isso nao acontece
vale notar que ambos os metodos foram sobrescrito hasCode e equals
class Carro{
String nome;
Carro(String s){
nome=s;
}
Carro(){
}
@Override
public boolean equals(Object one){
if( (one instanceof Carro)&&((Carro)one).nome == nome){
return true;
}else
return false;
}
@Override
public int hashCode(){
return nome.length();
}
}
public class NewClass{
public static void main(String[] args){
HashMap <Carro,String> m=new HashMap<Carro,String>();
Carro c=new Carro("Ford");
m.put(c,"Alemao");
m.put(new Carro("Porche"),"lucas");
c.nome="Fors"; //Fors != Ford
System.out.println(" encontrei " + m.get(c));
System.out.println(m.size());
}
}
Seu método equals esta errado, como nome é um objeto String você necessita utilizar o método equals da String. Ao invés de )&&((Carro)one).nome == nome, utilize )&&((Carro)one).nome.equals(nome)
simples ne… seu codigo hashing está gerando diferente, entao vc tem objetos true para o equals e false para o codigo hashing ja q vc subscreveu o metodo, tira o codigo hash e deixa o codigo da class String.
So uma dica: String e as classes Wrappers ja implementam o metodo equals e o codigo hashing.
[quote=LPJava]simples ne… seu codigo hashing está gerando diferente, entao vc tem objetos true para o equals e false para o codigo hashing ja q vc subscreveu o metodo, tira o codigo hash e deixa o codigo da class String.
So uma dica: String e as classes Wrappers ja implementam o metodo equals e o codigo hashing.
[quote=LPJava]simples ne… seu codigo hashing está gerando diferente, entao vc tem objetos true para o equals e false para o codigo hashing ja q vc subscreveu o metodo, tira o codigo hash e deixa o codigo da class String.
So uma dica: String e as classes Wrappers ja implementam o metodo equals e o codigo hashing.
[/quote]
so mais uma coisa tu sabe porque entao da certo se eu deixar o codigo sem alteracao mas instanciar carro com a chave na hora de usar o
get ,tipo:
o problema ai agora nao é equals é sim o codigo hashin que sempre sera o mesmo… olhe um exemplo:?
se vc tiver isso:ford,fory o codigo hashing será true pq vc disse que o codigo hashing é o tamanho da da string. porem para o equals isso é invalido.
Entao como vc tem um conjunto de maps o qual vc escolheu HashMap que usa o codigo hashing para a busca, porem nao se sabe a iteração entao é recomendavel que vc tenha um equals eficiente e um codigo hashing tb eficiente. tipo:
equals == true e hashcode == true temos ai um codigo hashing eficiente para usar em conjunto o qual usa hashing para busca.
Entao a lembre-se da regra somente subscreva o hashcode se vc subscrever o equals caso contrario nao há necessidade. E principalmente nesse seu caso ai… que vc usa uma String que por si so ela ja implementa de forma eficiente.
Implemente equals e hashcode quando sua classe nao implementar eles por exemplo.
class Carro{}
Ela nao implementa os metodos citados acima… entao se eu quiser ter uma iteração no conjunto de forma eficiente e tb encontrar a coisa certa devo implementar equals e hashcode…