Equals com maps

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());
    }
 }

Obrigado a todos!

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)

cara ve ai fiz a mudanca mas nao da certo

import java.lang.*;
import java.util.*;
class Carro{
   
    String nome;
    Carro(String s){
        nome=s;
    }
    Carro(){
        
    }
       @Override
    public boolean equals(Object one){
           if((one instanceof Carro)&&((Carro)one).nome.equals(nome))//codigo sujerido
           return true;
           else return false;
           
           
    // 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";
       System.out.println(" encontrei " + m.get(c));
       System.out.println(m.size());
    }
 }

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.

      @Override  
       public boolean equals(Object one){  
            if (one instanceof Carro) {
                 return ((Carro)one).nome.equals(nome));
            }
            return false;             
    }
     @Override  
        public int hashCode(){  
         return nome.hashCode();
        }

[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]
SHOW ISSO MESMO VALEU!!

You’r welcome!

[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:

import java.lang.*;
import java.util.*;

class Carro{
   
    String nome;
    Carro(String s){
        nome=s;
    }
    Carro(){
        
    }
       @Override
    public boolean equals(Object one){
           if((one instanceof Carro)&&((Carro)one).nome.equals(nome))
           return true;
           else return false;
           
           
    // if( (one instanceof Carro)&&((Carro)one).nome == nome){  
      // return true;
     //}else
       //    return false;
    }
   
    @Override
        public int hashCode(){
        return nome.length();//como antes
    }
}
 
 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="Ford";
       System.out.println(" encontrei " + m.get(new Carro("Fory")));//realmente nao encontra
       System.out.println(m.size());
     
    }
      
 }

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…

flw! espero ter ajudado.

[quote=LPJava]o problema ai agora nao é equals é sim o codigo hashin que sempre sera o mesmo… olhe um exemplo:?

[/code]

é verdade mesmo VALEU!!!