Comparar String

8 respostas
shenn

Tive prova de java na faculdade. O professor passou esse codigo e perguntou o que o que ele imprimi:

public class prova {

	public static void main(String[] args) {
		String nome1 = "shenn";
		String nome2 = "shenn";
		String nome3 = new String("shenn");
		
		System.out.println(nome1 == nome2);
		System.out.println(nome2 == nome3);
	}
}

Porque imprimi true e false?

8 Respostas

Rodrigo_Sasaki

Ja leu sobre o Pool de Strings?

F

Isso é porque o == compara endereços de memória.

Strings literais (nome1 = “sheen”, por exemplo) ficam no mesmo lugar, o pool de strings literais (string literal pool).
Strings não-literais (new String(“sheen”)) ficam na heap.

Por isso ao fazer o primeiro println ele dá true (nome1 aponta pra mesma instância do pool que nome2) e o segundo println dá false (nome2 aponta pra uma instância do pool e nome3 é da heap, lugares diferentes).

Procure comparar sempre usando o método equals(), que compara o conteúdo do objeto.

henriquecosta

Acho que é porque a comparação por ‘==’ só pega valores para tipos primitivos, o que não é o caso da Classe String …
Provavelmente nome1 e nome 2 estão referenciando o mesmo objeto na memória, que contém a String “shenn” … e
nome3 vc referenciou a um novo objeto, que é óbvio é diferente do outro, por isso á false

Faça um teste:

public class prova {   
  
    public static void main(String[] args) {   
        String nome1 = "shenn";   
        String nome2 = "shenn";   
        String nome3 = new String("shenn");  
        String nome4 = new String("shenn");
           
        System.out.println(nome1 == nome2);   
        System.out.println(nome2 == nome3);   
        System.out.println(nome2.equals(nome3));   
        System.out.println(nome3 == nome4);   
        System.out.println(nome3.equals(nome4));   
    }   
}
rodrigo.ferreira

Oi, bom dia!

Usar “==” compara endereços de memória… para o caso da classe String, você deve usar o método “equals” que compara o valor do objeto.

Sempre use o método “equals”.

Leia: http://www.cafeaulait.org/course/week4/37.html

String nome = "João da Silva"
String nome2 = "Maria Aparecida"

if ( nome.equals(nome2) ) {
   // faça algo se for igual
} else {
   // faça alguma coisa se for diferente...
}

Abraço,

Rodrigo_Sasaki
public static void main(String[] args){
    String nome1 = "shenn"; // Cria uma nova String literal "shenn" no pool e referencia a ela.
    String nome2 = "shenn"; // referencia à String literal "shenn" ja existente no pool
    String nome3 = new String("shenn"); // Cria um novo objeto String no heap, e referencia a ele.

    System.out.println(nome1 == nome2);
    System.out.println(nome2 == nome3);
}
Altere a linha 4 para
String nome3 = new String("shenn").intern();
e veja o que acontece.
R

sim mais mesmo assim acho que .equals() resolve o problema dele

caso queria comparar sem se preocupar maiusculas e minusculas

.equalsignorecase()

caiofabioa

E quando eu quiser comparar para receber um valor falso, por exemplo

se string1 for diferente de string 2 então faça isso

.equals não vai me ajudar nisso, há outro comando?

R

caiofabioa:
E quando eu quiser comparar para receber um valor falso, por exemplo

se string1 for diferente de string 2 então faça isso

.equals não vai me ajudar nisso, há outro comando?

neste caso tu podes usar
if (not (string1.equals(string2))){

ou entao if (!(string1.equals(string2)){

Criado 26 de junho de 2012
Ultima resposta 18 de jan. de 2013
Respostas 8
Participantes 7