2
respostas

Mudando uma String

Se a String é um objeto imutável, o que acontece quando eu escrevo este código? Ele está apagando a String antiga e gerando uma nova?

public static void main(String[] args) {

    String nome = "Alura";
    nome = nome.replace("A", "a");

    System.out.println(nome);

}
2 respostas

Olá João! Tudo bem?

Essa é uma dúvida muito comum de surgir no início da nossa jornada com Java.

Para entender melhor o que acontece quando utilizamos o método replace(), é importante lembrar como variáveis e referências a objetos funcionam...

Quando instanciamos um objeto, sempre precisamos de uma variável para atribuir a referência a esse objeto, certo? como podemos ver na imagem abaixo:

Exemplo de declaração de uma variável do tipo "Produto", chamada "exemplo", que recebe uma instância "new Produto();"

Na imagem: (1)- Tipo da variável, (2)- Nome da variável, (3)- Intância do objeto

Como sabemos, String é um objeto... ou seja, temos uma classe String que possui métodos e atributos como outras classes que utilizamos. Esse objeto recebe um array de caracteres que atribuímos entre aspas duplas.

Então... quando atribuímos a uma variável do tipo String uma sequencia de caracteres, estamos definindo a sequencia de caracteres imutável que essa instância do objeto String terá.

Mas variáveis podem receber novas referências... e é isso que ocorre quando utilizamos o método replace() da forma que vemos em seu exemplo.

Esse método nos retorna uma nova String com as alterações em relação a primeira String, e ocorre que você substituiu a referência que a variável nome tinha no código que você usou como exemplo acima.

Quando fazemos isso:

nome = nome.replace("A", "a");

Estamos atribuindo uma nova referência à variável nome. Isso significa que a sequencia de caracteres que anteriormente estava sendo referenciada para essa variável não está mais, e uma nova está em seu lugar, com as alterações que o método replace() fez nos caracteres.

Esse método cria uma cópia dos caracteres da primeira String, realiza a troca que nós o pedimos, e nos devolve uma nova String, como vemos na documentação oficial da Oracle. E imediatamente foi atribuída à variável nome essa nova String, substituindo a referência ao objeto anterior.

Se procurássemos na memória do comutador, ainda encontraríamos um espaço de memória sendo ocupado pela primeira String, sem nenhuma alteração. Mas agora, como não temos uma variável referenciando essa instância, não a vemos mais, e o garbage collector do Java irá cuidar dela.

Consegui te ajudar a entender o que ocorre nesse caso?

Vou deixar aqui abaixo alguns links de outros posts aqui do fórum sobre esse mesmo tema... com certeza eles vão ajudar ainda mais a te esclarecer essa dúvida:

Se ainda tiver dúvidas sobre esse tema, é só falar!

Bons estudos!

Muito obrigado!!