Comparação de Strings

8 respostas
diegohsi

Mais uma básica pessoal.

//Entrada de um nome qualquer while(nome.toLowerCase() != "fim"){ // Ele esta entrando no loop mesmo se eu digitar fim por que ? }

8 Respostas

evertonsilvagomesjav
diegohsi:
Mais uma básica pessoal.
//Entrada de um nome qualquer
while(nome.toLowerCase() != "fim"){
 // Ele esta entrando no loop mesmo se eu digitar fim por que ?
}

Strings sao objetos imutaveis, quando vc faz nome.toLowerCase() provavelmente sua variavel nome nao esta sendo criada em caixa baixa entao é gerado um novo objeto String, para comparar Strings use o metodo equals()

String nome = "Fim";
		
		while(!nome.toLowerCase().equals("fim")){   
			// Ele esta entrando no loop mesmo se eu digitar fim por que ?   
			
			System.out.println("nao entrou");
			}
AlexandreGama

Olá diegohsi!

No lugar de comparações com “==” ou “!=” tente usar

while (!linha.equals("FIM")

Até mais!

diegohsi

diegohsi:
Mais uma básica pessoal.

//Entrada de um nome qualquer while(nome.toLowerCase() != "fim"){ // Ele esta entrando no loop mesmo se eu digitar fim por que ? }

Pessoal consegui usando while(!nome.equals(“fim”)){}

Na verdade eles nunca serão iguais usando != pois há um new String() implicito e a sequência de bits que compreendem o objeto no heap comparando as Strings sempre serão diferentes ?? Estou certo pessoal.?

Desculpem é que estudei depois que postei, mas me confirmem por favor…

AlexandreGama

Hehe, o nosso amigo também postou a mesma coisa ao mesmo tempo. :wink:

Até mais!

diegohsi

Enquanto vcs respondiam eu postei esta e não vi a resposta de vcs, muito obrigado pela resposta ultra rápida pessoal
rsrsrs
abraços

AlexandreGama

Você pode até brincar com contains

public class VerificaSeExisteString { 
    public static void main(String args[]) throws IOException  {  
    	BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));  
  
        String linha = "";  
        while (!linha.contains("FIM")) {  
        	linha = reader.readLine();  
            System.out.println("Digitado: "+ linha);
        }
    }  
}

Funcionaria, mas neste caso, óbvio que é perigoso, já que você poderia digitar “FIMO” e ele sairia.
Fica como curiosidade mesmo.

Até mais!

evertonsilvagomesjav

diegohsi:
diegohsi:
Mais uma básica pessoal.

//Entrada de um nome qualquer while(nome.toLowerCase() != "fim"){ // Ele esta entrando no loop mesmo se eu digitar fim por que ? }

Pessoal consegui usando while(!nome.equals(“fim”)){}

Na verdade eles nunca serão iguais usando != pois há um new String() implicito e a sequência de bits que compreendem o objeto no heap comparando as Strings sempre serão diferentes ?? Estou certo pessoal.?

Desculpem é que estudei depois que postei, mas me confirmem por favor…

Na verdade nao tem um new String() implicito não, o que ocorre é que quando vc cria uma String literal, quando a classe é carregada essa literal fica armazenada em um pool de Strings então quando vc usa o método toLowerCase() é verificado no pool se ja existe alguma String criada com o nome “fim”, como nao existia porque o que estava criado no pool era “Fim” então a comparação te retornava false e o while era executado, entendeu?

ViniGodoy

Não funciona pq == compara se duas referências estão no mesmo local da memória, e não valores.

Enquanto o equals compara valores.

Exemplo:

String x = "Vinicius"; 
String y = x; //y aponta para o mesmo endereço de x.
String z = new String("Vinicius");

System.out.println(x == y); //True
System.out.println(y == z); //False

System.out.println(x.equals(y)); True
System.out.println(y.equals(z)); True
O java também tem um pool para todas as strings literais, ou seja, criadas com aspas. Portanto, se você fizer:
String x = "Marcelo";
String y = "Marcelo";

System.out.println(x == y); //True

Vai dar true. Como as Strings são criadas por aspas, ele irá reaproveitar o Marcelo de cima na referência de baixo. O new força a criação de uma nova String.

Criado 21 de outubro de 2010
Ultima resposta 21 de out. de 2010
Respostas 8
Participantes 4