O valor da String não foi alterado. O da referência s1 sim. Veja o que
acontece:

> String s1 = "Minha String";

ref.                             end.       heap
                                                ---------------
s1 = 0x99AB ----->  0x99AB  "Minha String"
                                                ---------------

> s1 = "Alterei o valor";

ref.                             end.       heap
                                               ---------------
s1 = 0x9A03           0x99AB  "Minha String"
|                                              ---------------
+-----------------> 0x9A03   "Alterei o valor"
                                               ----------------

Os endereços acima são hipotéticos. Você não tem acesso a eles. Veja que a
constante "Minha String" não foi alterada. Quando você faz s1 = "Alterei o
valor" na verdade você está copiando o ponteiro (ou referência) que contém o
endereço onde está localizada a outra constante "Alterei o valor". Como não
há mais referências apontando para "Minha String", o garbage collector irá
recolher o objeto tão logo seja possível.

O string é imutável porque não há métodos para modificá-lo. Veja que os
métodos replace(), append(), etc. de String sempre retornam um novo String.
O String original não é alterado.

Como strings são imutáveis e constantes, eles são mantidos em um pool e as
constantes são reutilizadas, por isto se você faz:

String s1 = "A";
String s2 = "B";

s1 e s2 contém referências idênticas e consequentemente apontam para o mesmo
objeto.Mas você não deve usar "==" para comparar strings pois geralmente,
quando você precisa compará-los, o string que você recebe foi criado em
outro lugar e realmente é outro objeto. Considere o seguinte:

String s1 = "A";
String s2= new String("A");

Agora temos dois objetos distintos. Uma comparação com "==" não funciona.

Helder.

--
Helder da Rocha ([EMAIL PROTECTED])
Web Consultant
www.argonavis.com.br
São Paulo, Brazil
+55 (11) 3044 4398
+55 (11) 9291 0567

----- Original Message -----
From: "Rafael Steil" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, August 20, 2002 12:34 PM
Subject: Re: Fw: [java-list] Problema de IF


>
> Bom, eu concordo que a documentacao diz isso, e ja fiz testes onde
realmente
> nao consegui alterar o valor de uma String. Mas entao porque o codigo
>
> public class StringTest
> {
> public static void main(String args[])
> {
> String s1 = "Minha String";
> System.out.println("s1: "+ s1);
> s1 = "Alterei o valor";
> System.out.println("s1 alerada: "+ s1);
> }
> }
>
> mostra os valores "Minha String"  "Alterei o valor" ? ou seja, o valor da
String foi
> modificado. Isso me deixa um pouco confuso tmb..
>
> Rafael Steil
>
> > Ola...
> > Como voce fez isso?  Acho que nao pode mudar o valor de uma String de
jeito nenhum
> > Se voce olhar o codigo fonte da classe java.lang.String, vai ver:
> >
> >     private char value[];
> >
>
> ------------------------------ LISTA SOUJAVA ----------------------------
> http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP
> dúvidas mais comuns: http://www.soujava.org.br/faq.htm
> regras da lista: http://www.soujava.org.br/regras.htm
> historico: http://www.mail-archive.com/java-list%40soujava.org.br
> para sair da lista: envie email para [EMAIL PROTECTED]
> -------------------------------------------------------------------------
>
>



------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a