segunda-feira, 26 de setembro de 2011

Porque utilizar equals() e não == para comparar String

Uma pergunta bem básica e objetiva, é possível comprar String utilizando == ? Sim. Da certo 100% das vezes? Não.

Uma das primeiras coisas que aprendi quando comecei a programar em java foi JAMAIS utilizar == para comprar Strings, mais porque isso? Vamos a uma explicação técnica.

String é um objeto, o metodo equals(Object) vai retornar true se ambas as Strings tiverem o mesmo objeto. O operador == só ira retornar true se ambas referencias de String apontarem para a mesma referencia do objeto.

Quando criamos uma String de forma literal é criado um pool de Strings, quando criamos uma outra String literal com o mesmo valor a JVM procura se ja existe uma String com esse mesmo valor no pool de Strings, caso exista, faz sua variável apontar para o mesmo endereço de memória. Por este motivo, quando você testa a igualdade das variáveis a e b através do "==", ela retorna true.


String a = "abc";    //pool de string
String b = "abc";    /*ja existe uma string com o mesmo conteúdo no pool,
                                 vai para a mesma referencia na memória*/
String c = "dda";    //vai para uma nova referencia de memoria pois não existe no pool

Se você criar strings assim, você está criando um novo objeto em memória e se testar a igualdade das variáveis a e d com "==", ela retornará false, pois não apontam para o mesmo lugar na memória.

String d = new String("abc");     //Cria um novo objeto na memoria



String a = "abc";
String b = "abc";
String c = "dda";
String d = new String("abc");


a==b = true
a==c = false
a==d = false
a.equals(d) = true



4 comentários:

  1. Ok, agora a=="abc" é true mas d=="abc" é false. Pq?

    ResponderExcluir
    Respostas
    1. quando tu escreve "abc" tu ta criando uma string "anonima"... ou seja, é o mesmo caso de a="abc" e b="abc"

      Excluir
  2. eu criei essa comparação para login e senha porem quando digito um registro que nao existe no banco ele nao retorna o erro Login ou Senha inválidos podem me ajudar

    if(txt_login.getText().equals("") || txt_senha.getText().equals("")){
    JOptionPane.showMessageDialog(null, "Login ou Senha nao pode ser vazio.");
    }else{

    Conn conexao = new Conn();
    conexao.getConn();



    String sql = "Select login,senha from tab_login where login = '"+ txt_login.getText()+"';";
    conexao.executeSql(sql);
    ResultSet rs = conexao.resultset;


    try {
    while(rs.next()) {

    String login = rs.getString("login");
    String senha = rs.getString("senha");



    if(txt_login.getText().equals(login) && txt_senha.getText().equals(senha)){

    TelaPrincipal principal = new TelaPrincipal();
    principal.setVisible(true);
    dispose();

    }else{
    JOptionPane.showMessageDialog(null,"Login ou Senha inválidos.");

    }

    }
    } catch (SQLException ex) {
    Logger.getLogger(LoginSenha.class.getName()).log(Level.SEVERE, null, ex);
    }


    }





    }

    ResponderExcluir