Cosa significa immutabile?


103

Se una stringa è immutabile, significa che ... (supponiamo JavaScript)

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo

Significa che quando si chiamano metodi su una stringa, restituirà la stringa modificata, ma non cambierà la stringa iniziale?

Se la stringa fosse mutabile, significa che anche la seconda alert()sarebbe tornata oo?

Risposte:


104

Significa che una volta istanziato l'oggetto, non è possibile modificarne le proprietà. Nel tuo primo avviso non stai cambiando foo. Stai creando una nuova stringa. Questo è il motivo per cui nel secondo avviso mostrerà "foo" invece di oo.

Significa che quando si chiamano metodi su una stringa, restituirà la stringa modificata, ma non cambierà la stringa iniziale?

Sì. Niente può cambiare la stringa una volta creata. Ora questo non significa che non puoi assegnare un nuovo oggetto stringa alla strvariabile. Non è possibile modificare l'oggetto corrente a cui str fa riferimento.

Se la stringa fosse mutabile, significa che anche il 2 ° avviso () restituirebbe oo?

Tecnicamente no, perché il metodo della sottostringa restituisce una nuova stringa. Rendere mutabile un oggetto non cambierebbe il metodo. Renderlo mutabile significa che tecnicamente, potresti farlo in modo che la sottostringa cambi la stringa originale invece di crearne una nuova.


La stessa stringa, se modificata e assegnata, aggiornerà la stringa var str = 'foo'; str = str.substr (1)); // oo alert (str); // oo
Ashwin G

Che dire del codice sottostante. Il valore della stringa ora è cambiato. var name = "Santosh"; console.log (name.substr (0,2)); var name = "kumar" console.log (nome); Come è ancora immutabile
Santosh

97

A un livello inferiore, l'immutabilità significa che la memoria in cui è archiviata la stringa non verrà modificata. Dopo aver creato una stringa "foo", viene allocata una parte della memoria per memorizzare il valore "foo". Questa memoria non verrà alterata. Se si modifica la stringa con, ad esempio, substr(1)viene creata una nuova stringa e viene allocata una parte diversa della memoria che verrà archiviata "oo". Ora hai due stringhe in memoria "foo"e "oo". Anche se non lo utilizzerai "foo"più, rimarrà fino a quando non verrà raccolto.

Uno dei motivi per cui le operazioni sulle stringhe sono relativamente costose.


1
Anche i numeri sono immutabili.
RN Kushwaha

3
ciao dal 2015 !! "A un livello inferiore, l'immutabilità significa che la memoria in cui è memorizzata la stringa non verrà modificata." --- questo è troppo restrittivo e non suona bene. L'immutabilità riguarda solo lo spazio utente, la memoria virtuale può essere modificata come piace all'allocatore di memoria non appena vengono mantenute le invarianti delle specifiche della lingua.
zerkms

2
Questa risposta è più logica della risposta accettata.
Ejaz Karim,

Ma posso fare come var str = 'foo'; posso modificare tramite str = 'bar'. il valore str è stato modificato in questo modo, giusto?
Hacker

@Hacker No. Hai assegnato una nuova stringa alla variabile che punta a una nuova posizione in memoria.
inganno

13

Immutabile significa ciò che non può essere cambiato o modificato.

Pertanto, quando si assegna un valore a una stringa, questo valore viene creato da zero anziché essere sostituito. Quindi ogni volta che viene assegnato un nuovo valore alla stessa stringa, viene creata una copia. Quindi, in realtà, non cambierai mai il valore originale.


9

Non sono sicuro di JavaScript, ma in Java le stringhe fanno un ulteriore passo verso l'immutabilità, con lo "String Constant Pool". Le stringhe possono essere costruite con string literals ( "foo") o con un Stringcostruttore di classi. Le stringhe costruite con valori letterali stringa fanno parte del pool di costanti stringa e lo stesso valore letterale stringa sarà sempre lo stesso indirizzo di memoria del pool.

Esempio:

    String lit1 = "foo";
    String lit2 = "foo";
    String cons = new String("foo");

    System.out.println(lit1 == lit2);      // true
    System.out.println(lit1 == cons);      // false

    System.out.println(lit1.equals(cons)); // true

In quanto sopra, entrambi lit1e lit2sono costruiti usando la stessa stringa letterale, quindi puntano allo stesso indirizzo di memoria; lit1 == lit2risultati true, perché sono esattamente lo stesso oggetto.

Tuttavia, consviene costruito utilizzando il costruttore della classe. Sebbene il parametro sia la stessa costante di stringa, il costruttore alloca nuova memoria per cons, il significato consnon è lo stesso oggetto di lit1e lit2, nonostante contenga gli stessi dati.

Ovviamente, poiché le tre stringhe contengono tutte gli stessi dati di carattere, l'utilizzo del equalsmetodo restituirà true.

(Entrambi i tipi di costruzione delle stringhe sono immutabili, ovviamente)


3

Immutabile significa che il valore non può essere modificato. Una volta creato un oggetto stringa non può essere modificato in quanto non modificabile. Se richiedi una sottostringa di una stringa, viene creata una nuova stringa con la parte richiesta.

L'uso di StringBuffer durante la manipolazione delle stringhe rende invece l'operazione più efficiente poiché StringBuffer memorizza la stringa in un array di caratteri con variabili per contenere la capacità dell'array di caratteri e la lunghezza dell'array (String in una forma di array di caratteri)


3

La definizione del libro di testo di mutabilità è responsabile o soggetta a modifiche o alterazioni. Nella programmazione, usiamo la parola per indicare oggetti il ​​cui stato può cambiare nel tempo. Un valore immutabile è l'esatto opposto: una volta creato, non potrà mai cambiare.

Se questo sembra strano, permettimi di ricordarti che molti dei valori che usiamo sempre sono in realtà immutabili.

var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);

Penso che nessuno sarà sorpreso di apprendere che la seconda riga non cambia in alcun modo la stringa nell'istruzione. In effetti, nessun metodo stringa cambia la stringa su cui operano, restituiscono tutte nuove stringhe. Il motivo è che le stringhe sono immutabili: non possono cambiare, possiamo solo creare nuove stringhe.

Le stringhe non sono gli unici valori immutabili incorporati in JavaScript. Anche i numeri sono immutabili. Riuscite a immaginare un ambiente in cui valutare l'espressione 2 + 3 cambia il significato del numero 2? Sembra assurdo, eppure lo facciamo con i nostri oggetti e array tutto il tempo.


2

Dalle stringhe agli stack ... un esempio semplice da capire tratto dal blog di Eric Lippert :

Path Finding Using A * in C # 3.0, Part Two ...

Uno stack mutabile come System.Collections.Generic.Stack chiaramente non è adatto. Vogliamo essere in grado di prendere un percorso esistente e creare nuovi percorsi da esso per tutti i vicini del suo ultimo elemento, ma spingere un nuovo nodo sullo stack standard modifica lo stack. Dovremmo fare copie dello stack prima di spingerlo, il che è sciocco perché in tal caso duplicheremmo tutti i suoi contenuti inutilmente.

Gli stack immutabili non presentano questo problema. Spingere su una pila immutabile crea semplicemente una pila nuova di zecca che si collega a quella vecchia come coda. Dato che lo stack è immutabile, non c'è pericolo che qualche altro codice arrivi e interferisca con il contenuto della coda. Puoi continuare a utilizzare il vecchio stack a tuo piacimento.

Per approfondire la comprensione dell'immutabilità, leggi i post di Eric che iniziano con questo:

Immutabilità in C # Parte prima: tipi di immutabilità


Quella citazione contiene una strana affermazione: che la struttura dei dati dello stack (in realtà più stack con condivisione della coda) è, nel suo insieme, una struttura mutabile - ogni push o pop cambia la struttura. Solo i singoli elementi sono immutabili. E in linea di principio, potresti avere la stessa struttura ma con elementi mutabili. Ciò accade in alcune varianti dell'IIRC di ricerca dell'unione irreversibile. L'immutabilità ha grandi vantaggi, ma condividere una parte o tutta una struttura di dati come ottimizzazione è perfettamente possibile con i mutabili. Anche se desideri un'apparente immutabilità per altri riferimenti, puoi sempre eseguire il copy-on-write secondo necessità.
Steve314

0

Un modo per comprendere questo concetto è osservare come javascript tratta tutti gli oggetti, che è per riferimento. Il che significa che tutti gli oggetti sono mutabili dopo essere stato istanziato, questo significa che è possibile aggiungere un oggetto con nuovi metodi e proprietà. Questo è importante perché se si desidera che un oggetto sia immutabile, l'oggetto non può cambiare dopo essere stato istanziato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.