Explicando a imutabilidade da classe String
- #Java
Em nossa jornada pela classe String, nos deparamos com uma característica crucial: a imutabilidade. Isso quer dizer que uma vez que uma string é criada, ela não pode ser modificada. Vejamos isso em ação com nosso exemplo:
public class ImutabilidadeExemplo {
public static void main(String[] args) {
// Criando uma string
String saudacao = "Olá, ";
// Tentativa de modificar a string
saudacao.concat("mundo!");
// Exibindo a string "modificada"
System.out.println("Saudação: " + saudacao);
}
}
Um desavisado tentou modificar a string saudacao usando o método concat para (advinhe) concatenar com a string "mundo!". Ele esperava obter o seguinte resultado:
Saudação Original: Olá, mundo!
Em vez disso, o que ele viu no console foi:
Saudação Original: Olá,
Isso mesmo. O método concat não conseguiu alterar a string saudacao. Não é surpresa para nós. Apenas comprovamos que a classe String em Java realmente é imutável. Mas seria muito forte dizer que as strings são completamente inflexíveis nesse sentido. Vamos dar atenção ao que se segue.
Para efetivamente "modificar" a saudacao, precisaríamos atribuir o resultado da concatenação de volta à variável, como exemplificado abaixo:
String saudacao = "Olá, ";
// Atribuindo a concatenação de volta à variável
saudacao = saudacao.concat("mundo!");
System.out.println("Saudação Modificada: " + saudacao);
E o resultado:
Saudação Modificada: Olá, mundo!
Então é possível modificar strings, não? Apenas tivemos que dar um jeitinho. Caiu por terra o que falamos sobre imutabilidade.
Não é bem assim. Estamos prestes a fazer uma descoberta interessante.
Vamos à explicação: apesar de parecer que modificamos a string, na realidade nós criamos uma nova. Bem, não exatamente nós. A Virtual Machine.
A VM:
(1) - criou um novo objeto String com o resultado da concatenação ("Olá, mundo!") e
(2) - fez com que a referencia saudacao apontasse para esse novo objeto.
Ou seja, o objeto original "Olá, " não foi modificado. Ele permanece lá na memória.
Atente-se a um ponto importante: O objeto string é imutável. Sua variável de referência, não. Ela pode ser reatribuída para apontar para uma nova instância de string.
Assim, compreendemos que operações que parecem modificar strings, na realidade, criam novas strings, mantendo a integridade e imutabilidade da string original.
Dúvidas? Compartilhe nos comentários. Talvez eu possa te responder diretamente, ou, por meio de um artigo, sanar a questão.
Se encontrar algum erro técnico nas explicações, mostra pra gente nos comentários também. Ficarei feliz em aprender com você e farei as devidas correções no artigo.
Conheça também o meu blog, onde tento simplificar o mundo Java: https://odevjava.blogspot.com/