In quali casi ed esempi String in Java non è immutabile? [duplicare]

-1

Se le stringhe sono immutabili in Java, perché l'output di questo codice è 2GB, invece di 1GB?

class Laptop {
   String memory = "1GB";
}

class Workshop {
    public static void main(String args[]) {
       Laptop life = new Laptop();
       repair(life);
       System.out.println(life.memory);
    }

    public static void repair(Laptop laptop) {
        laptop.memory = "2GB";
    }
}
    
posta Nemus 02.02.2016 - 17:55
fonte

1 risposta

20

Stai confondendo l'immutabilità del riferimento all'oggetto e l'immutabilità dell'oggetto stesso. Sono cose separate.

laptop.memory è solo un riferimento (puntatore) all'oggetto. Questo può essere modificato, cioè puoi cambiare il riferimento per puntare a un oggetto diverso - che è esattamente quello che hai fatto - hai creato un secondo oggetto String contenente "2GB" e assegnato il suo riferimento (puntatore) a laptop.memory. L'oggetto String originale non è ancora modificato (o forse è garbage collection).

Lo stesso comportamento si applica a tutti gli oggetti in Java, ma le primitive sono diverse (non hanno riferimenti e sono realmente modificate direttamente).

BTW, puoi avere un riferimento immutabile in Java con la parola chiave finale:

class Laptop {
   final String memory = "1GB";
}

Con questa modifica, il tuo codice non verrà compilato perché tenti di modificare il riferimento.

    
risposta data 02.02.2016 - 18:03
fonte

Leggi altre domande sui tag