Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida sobre a imutabilidade da String

Olá!

Eu dei uma boa revisada mas mesmo assim não entendi exatamente, bom vamos lá.

public class TesteString {

    public static void main(String[] args) {
        //Primeira parte
        String var1 = "Lucca";
        var1.replace("L", "l");
        System.out.println(var1);
        var1.toLowerCase();
        System.out.println(var1);
        String var2 = var1.replace("L", "l");
        System.out.println(var2);
        String var3 = var1.toUpperCase();
        System.out.println(var3);
        // até aqui foi compreendido o conceito e praticado.
        //Segunda parte
        TesteString testeString = new TesteString();
        System.out.println(testeString.var4);
        testeString.var4.replace("R", "r");
        System.out.println(testeString.var4);
        testeString.var4.toUpperCase();
        System.out.println(testeString.var4);
        testeString.setVar4("RAFAEL");
        System.out.println(testeString.var4);
    }
    private String var4 = "Rafael";
    public void setVar4 (String var4){
        this.var4 = var4;
    }

}

//CONSOLE
Lucca
Lucca
lucca
LUCCA
Rafael
Rafael
Rafael
RAFAEL

Segue meu código, como o professor disse que a String é imutável eu compreendi então que chamando o método na variável var1 não funcionaria, apenas nas variaveis var2 e var3 ele consegueria alterar a String pois na verdade recebe outra String, outro objeto.

Até na segunda parte do código na variável var4 , os métodos testeString.var4.replace() e testeString.var4.toUpperCase() não funcionam foi compreendido também.

Porém então quando eu crio a instância do objeto e seto testeString.setVar4("RAFAEL"), a String mudou para RAFAEL. Nesse caso então o que ocorreu? Foi setado uma nova String no mesmo objeto ou foi criado outro? Então ela ainda é imutável? Ou o que se chama de imutavél é apenas os métodos da classe String, e não quando atribuímos nada a ele?

Obrigado pela ateção, espero ter sido claro.

3 respostas

Fala ai, tudo bem ?

Cara, a String é imutável.

Toda modificação que você tentar fazer nela, sempre devolverá uma nova String.

Quando você usou o setter, você alterou a referencia de memoria do seu atributo, por esse motivo, o valor foi alterado.

Boa tarde man!

Obrigado pela atenção...

Mas então até ai ok isso eu imaginei também, mas então foi retornado um novo objeto? Ou alterado o objeto?

Pois pra mim não fica claro que a String é imutável sendo que ela acabou de ser alterada, a não ser que tenha sido criado pelo meu setter um novo objeto e "destruído" o anterior, devolvendo um novo objeto, uma nova String.

Obrigado!!!

solução!

Sim, é sempre criado um objeto novo.

Ele não destroi o objeto, ele fica na memória, disponível para o Garbage Collector ir pega-lo.

Em nenhum momento você altera ela, sempre em memoria, é criada uma nova instância pra ti.