While é uma referência?

14 respostas
rafacyber

Só depois de três anos eu me deparo com um probleminha no java relacionado ao while. Quando uso um ("via"=="vie"), ou (""vie=="vie"), o programa para sem dar explicação.

package revisãowhile;

import java.util.Scanner;


public class testandoWhile { 

    public static void main( String args[])
    {
        System.out.println("Palavra: ");

        Scanner input = new Scanner(System.in);

        String palavra = input.nextLine();

        while(palavra == "via")
        {
            System.out.println(palavra);
        }
    }
}
No código acima, o java não acusa erro, usei então um outro código como:
package revisãowhile;

import java.util.Scanner;


public class testandoWhile { 

    public static void main( String args[])
    {
        System.out.println("Palavra: ");

        Scanner input = new Scanner(System.in);

        String palavra = input.nextLine();

        while(palavra.equals("via"))
        {
            System.out.println(palavra);
        }
    }
}

Alguém pode me explicar porque o java não reconhece a comparação de duas Strings dentro de um while?

14 Respostas

willcrisis

Comparações com o operador == só são válidas para tipos primitivos (int, char, double, etc…). Comparações entre objetos não-primitivos (String, File, etc.) só são feitas através do método equals.

rafacyber

Muito grato pela resposta, não imaginei que fosse tão rápido.

bruno.leite

Seguinte cara, para saber mais sobre a classe Scanner você pode dar uma olhada mais afundo nesse site:

A classe Scanner usa como delimitador padrão o espaço, então oque retorna na sua String é ‘Palavra’.

A questão do == e do equals em String é um caso a parte no Java devido ao seu Pool de String, quando as Strings são literais você pode usar == que ele retornará true, como no exemplo:

String str1 = "Palavra";
String str2 = "Palavra";
if (str1 == str2){
    //Retorna True
}
if (str1.equals(str2)){
    //Retorna True
}

Se você usar o new String, você irá gerar objetos diferentes, logo somente o equals irá funcionar, como no exemplo:

String str1 = new String("Palavra");
String str2 = new String("Palavra");
if (str1 == str2){
    //Retorna False
}
if (str1.equals(str2)){
    //Retorna True
}

[]'s

G

O operador ’ == ’ não é válido somente para tipos primitivos; é utilizado também para verificar se duas referências de objeto estão referenciando o mesmo objeto.

MyObject o1 = new MyObject(); MyObject o2 = o1; System.out.println(o2==o1) // true

Se estiver errado, me corrijam!
Abs.

peczenyj

exato, entre objetos o == verifica se as referências apontam para o mesmo objeto.

frequentemente retorna verdade quando temos pool de strings ou cache de objetos (como Integer entre -256 a 255).

bruno.leite

O operador ’ == ’ não é válido somente para tipos primitivos; é utilizado também para verificar se duas referências de objeto estão referenciando o mesmo objeto.

MyObject o1 = new MyObject(); MyObject o2 = o1; System.out.println(o2==o1) // true

Se estiver errado, me corrijam!
Abs.

Você está correto, porém ele disse que == só vale para comparar valores de tipos primitivos, para estados de objetos é preciso usar o equals :slight_smile:

TangZero

peczenyj:
exato, entre objetos o == verifica se as referências apontam para o mesmo objeto.

frequentemente retorna verdade quando temos pool de strings ou cache de objetos (como Integer entre -256 a 255).

O range não era de -128 à 127???

alucardeck

TangZero:
peczenyj:
exato, entre objetos o == verifica se as referências apontam para o mesmo objeto.

frequentemente retorna verdade quando temos pool de strings ou cache de objetos (como Integer entre -256 a 255).

O range não era de -128 à 127???

são 256 valores…

de -128 a 127

TangZero

Acho que já tinhamos comentado sobre isso em outro post… Por isso fiquei na dúvida…

claudneto

Não é possível fazer comparações dessa maneira com compareTo() tbm?

Se compareTo for =…Strings iguais…

<…a 1ª String é menor…portanto…diferente…

…a 1ª String é maior…portanto…diferente…

=)

TangZero

Não é possível fazer comparações dessa maneira com compareTo() tbm?

Se compareTo for =…Strings iguais…

<…a 1ª String é menor…portanto…diferente…

…a 1ª String é maior…portanto…diferente…

=)

A linguagem permite, mas…
Cheira a Gambeta daquelas… :lol:

bruno.leite

como diria um amigo… JManobra ou JMarreta :stuck_out_tongue: hauhauahauhauha

alucardeck

claudneto:

Não é possível fazer comparações dessa maneira com compareTo() tbm?

Se compareTo for =…Strings iguais…

<…a 1ª String é menor…portanto…diferente…

…a 1ª String é maior…portanto…diferente…

=)

o metodo compareTo() é util para outras coisas…
nesse caso é muito mais “correto” usar .equals()

TangZero

WebWork…Around…

Criado 13 de agosto de 2008
Ultima resposta 13 de ago. de 2008
Respostas 14
Participantes 8