A diferença é que no primeiro exemplo, a declaração das duas variáveis String (x e y) são uma forma especial de inicialização em Java, porque os valores à direita do operador de atribuição são literais, e não objetos String. Os literais tem todos os atributos e procedimentos da classe String, mas são alocados, em tempo de compilação, numa estrutura chamada "pool de Strings". Ao serem alocados, relaciona-se um valor canônico a cada uma dessas literais, que visa identificar unicamente String's de valores iguais. Esse valor que se relaciona a cada String é obtido através do método "intern()", da classe String. Quando esse método é explicitamente chamado, seja numa variável String do tipo literal ou objeto, caso essa String já se encontre no pool de String's, o valor do pool é obtido. Caso contrário, se a String em questão não estiver no pool, o método intern() coloca ela no pool, e retorna a referência atual do objeto String. Simplificando:

         para quaisquer objetos s e t, da classe String, s.intern() == t.intern(), se e somente se s.equals(t) retorna true...

    Nas variáveis String do tipo literal, o método intern() é "implicitamente" chamado, sempre que necessário, em operações de comparação, por exemplo. Valores retornados por métodos, como o toString() da classe Integer, não retorna valores literais, e sim uma referência para o objeto String de retorno do método, que varia de acordo com posição alocada por esse valor na área de heap da memória do programa, definida e estruturada dinamicamente em tempo de execução.

 

Rosfran Lins Borges

Analista de Sistemas - NDS

[EMAIL PROTECTED]

Fóton® Informática e Serviços

Fone: (61) 328 5060 R.: 272

 

-----Mensagem original-----
De: Michel [mailto:[EMAIL PROTECTED]]
Enviada em: terça-feira, 15 de outubro de 2002 11:36
Para: [EMAIL PROTECTED]
Assunto: [java-list] Instâncias

 

Olá galera!

    Para exemplificar minha dúvida, mostrarei dois exemplos:

-------------EXEMPLO 1--------------

public static void main(String args[])

{

    String x = "100";

    String y = "100";

    if(x == y)

        System.out.println("IGUAL!!!")

}

------------EXEMPLO 2----------

public static void main(String args[])

{

    String x = "100";

    String y = Integer.toString(100);

    if(x == y)

        System.out.println("IGUAL!!!");

}

 

No exemplo 1, aparece na tela "IGUAL!!!", no exemplo 2 não aparece nada!

Sei que para comparar duas Strings tenho o mótodo equals(String s), mas para fins de conhecimento, gostaria de saber por quê o 1º exemplo funciona e o 2º não.

 

Obrigado.

Responder a