While é uma referência?

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.

[code]

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

}[/code]

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?

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.

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

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

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.

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 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.[/quote]

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:

[quote=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).[/quote]

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

[quote=TangZero][quote=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).[/quote]

O range não era de -128 à 127???
[/quote]

são 256 valores…

de -128 a 127

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

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…

=)

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…

=)[/quote]

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

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

[quote=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…

=)[/quote]

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

WebWork…Around…