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

Criando outra String

A resposta do exercício é essa abaixo:

String nome = "Mario";
nome = nome.replace('o', 'a');
System.out.println(nome);

Pelo que eu entendi, a imutabilidade da classe String gera a necessidade de criarmos novas variáveis para utilizar seus métodos. Mas no exemplo acima (que é a resolução do problema) parece não haver essa necessidade de criar uma nova variável. Eu tentei fazer o teste e apesar do resultado estar correto eu não consegui mais acessar a variável antiga "Mario". Teria uma forma de acessá-la? Isso é quase que uma forma de burlar a imutabilidade ?

2 respostas
solução!

Oi Enzo

Em Java, quando criamos a parte da esquerda da atribuição, ou seja, essa parte:

String nome

Estamos basicamente criando um ponteiro, que é uma "caixa" em memória que recebe/aponta para o endereço de memória com o valor, no caso, a própria String "Mario", por exemplo.

Resumindo, quando fazemos: String nome = "Mario"; Estamos basicamente dizendo "Cria a string Mario em memória e faz a referência 'nome' apontar para ela.", tudo bem?

O resultado de "nome.replace('o', 'a')" gera uma nova String, ou seja, outro valor em memória. Se fizemos nome receber esse novo valor, o valor antigo será sobreescrito e não teremos mais como acessa-lo.

Dito isso, se você quiser ter acesso ao valor antigo e ao valor novo, será necessário ter uma referência para cada String:

String nome = "Mario";
String novoNome = nome.replace('o', 'a');

System.out.println(nome);
System.out.println(novoNome);

Bom dia, Enzo.

A imutabilidade não altera a própria variável "nome", mas quando você fez "nome.replace", um outro objeto foi criado e você atribuiu ele à variável nome.

Como teste, fiz o seguinte código:

    public static void main(String[] args) {
        String nome = "Bolo";

        nome.replace('o', 'a');
        System.out.println(nome);

        nome = nome.replace('o', 'a');
        System.out.println(nome);


        if(nome == (nome.replace('o', 'a').replace('a', 'o'))) {
            System.out.println("Mesma instancia");
        } else {
            System.out.println("Outra instancia");
        }

    }

No primeiro print, fiz apenas um replace, sem atribuir o resultado, e imprimi nome. A saída foi "Bolo", pois a variável nome não foi alterada.

No segundo, ao atribuir o resultado para a variável nome, a saída é "Bala".

No fim, comparei a variável "nome" com o resultado de fazer 2 replaces consecutivos (o para a, e de volta de a para o), e o resultado foi "Outra Instancia". Isso mostra que mesmo o texto sendo o mesmo, a instancia é outra.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software