Qual è il vantaggio di una stringa che è immutabile?

Una volta ho studiato il vantaggio di una stringa immutabile a causa di qualcosa per migliorare la performance in memoria.

Qualcuno può spiegarmelo? Non riesco a trovarlo su Internet.

Immutabilità (per archi o altri tipi) può avere numerosi vantaggi:

  • Rende più facile ragionare sul codice, dal momento che puoi fare ipotesi su variabili e argomenti che altrimenti non potresti fare.
  • Semplifica la programmazione multithreading poiché la lettura di un tipo che non può essere modificato è sempre sicura da fare contemporaneamente.
  • Consente una riduzione dell’utilizzo della memoria consentendo di combinare valori identici e di fare riferimento da più posizioni. Sia Java che C # eseguono internazioni di stringhe per ridurre il costo di memoria delle stringhe letterali incorporate nel codice.
  • Semplifica la progettazione e l’implementazione di determinati algoritmi (come quelli che utilizzano il backtracking o il partizionamento dello spazio dei valori) perché lo stato calcolato in precedenza può essere riutilizzato in seguito.
  • L’immutabilità è un principio fondamentale in molti linguaggi di programmazione funzionale: consente al codice di essere visto come una serie di trasformazioni da una rappresentazione all’altra, piuttosto che una sequenza di mutazioni.

Le stringhe immutabili aiutano anche ad evitare la tentazione di utilizzare le stringhe come buffer. Molti difetti nei programmi C / C ++ riguardano problemi di sovraccarico del buffer derivanti dall’uso di array di caratteri nudi per comporre o modificare valori stringa. Trattare le stringhe come tipi mutabili incoraggia l’utilizzo di tipi più adatti alla manipolazione del buffer (vedere StringBuilder in .NET o Java).

Considera l’alternativa. Java non ha qualificatore const. Se gli oggetti String fossero mutabili, qualsiasi metodo con cui si passa un riferimento a una stringa potrebbe avere l’effetto collaterale della modifica della stringa. Le stringhe immutabili eliminano la necessità di copie difensive e riducono il rischio di errori di programma.

Le stringhe immutabili sono economiche da copiare, perché non è necessario copiare tutti i dati, basta copiare un riferimento o un puntatore ai dati.

Le classi immutabili di qualsiasi tipo sono più facili da utilizzare in più thread, l’unica sincronizzazione necessaria è la distruzione.

a) Immaginate la funzionalità StringPool senza rendere immutabile la stringa, non è affatto ansible perché nel caso del pool di stringhe un object stringa / letterale ad esempio “Test” ha fatto riferimento a molte variabili di riferimento, quindi se uno di essi modifica il valore gli altri saranno automaticamente viene influenzato vale diciamo String A = “Test” e String B = “Test” Ora String B chiamato “Test” .toUpperCase () che cambia lo stesso object in “TEST”, quindi A sarà anche “TEST” che non è auspicabile.
b) Un altro motivo per cui Why String è immutabile in Java è consentire a String di memorizzare nella cache il suo hashcode, essendo immutabile String in Java memorizza nella cache il suo codice hash e non calcola ogni volta che chiamiamo il metodo hashcode di String, che lo rende molto veloce come chiave hashmap .

Pensa a varie corde sedute su una piscina comune. Le variabili stringa quindi puntano a posizioni nel pool. Se copi una variabile stringa, sia l’ originale che la copia condividono gli stessi caratteri. Questa efficienza di condivisione supera l’inefficienza dell’editing delle stringhe estraendo sottostringhe e concatenazioni.

Forse, la mia risposta è obsoleta, ma probabilmente qualcuno troverà qui una nuova informazione.

Perché Java String è immutabile e perché è buono:

  • puoi condividere una stringa tra i thread ed essere sicuro che nessuno di loro cambierà la stringa e confonderà un altro thread
  • non hai bisogno di un lucchetto. Diversi thread possono lavorare con stringhe immutabili senza conflitti
  • se hai appena ricevuto una stringa, puoi essere certo che nessuno cambierà il suo valore dopo questo
  • puoi avere molti duplicati di stringhe: saranno puntati su una singola istanza, su una sola copia. Ciò consente di risparmiare memoria del computer (RAM)
  • puoi eseguire sottostringhe senza copiare, – creando un puntatore all’elemento di una stringa esistente. Questo è il motivo per cui l’implementazione della sottostringa Java è così veloce
  • le stringhe immutabili (oggetti) sono molto più adatte per usarle come chiave nelle tabelle hash

Fondamentalmente, se un object o un metodo desidera passare le informazioni a un altro, ci sono alcuni modi in cui può farlo:

  1. Può dare un riferimento a un object mutabile che contiene le informazioni e che il destinatario promette di non modificare mai.

  2. Può dare un riferimento a un object che contiene i dati, ma di cui non interessa il contenuto.

  3. Può memorizzare le informazioni in un object mutevole di cui è a conoscenza il destinatario dei dati previsti (generalmente uno fornito da quel destinatario di dati).

  4. Può restituire un riferimento a un object immutabile contenente l’informazione.

Di questi metodi, # 4 è di gran lunga il più semplice. In molti casi, gli oggetti mutabili sono più facili da utilizzare rispetto a quelli immutabili, ma non esiste un modo semplice per condividere con codice “non attendibile” le informazioni contenute in un object mutevole senza dover prima copiare le informazioni in qualcos’altro. Al contrario, le informazioni contenute in un object immutabile al quale si detiene un riferimento possono essere facilmente condivise semplicemente condividendo una copia di tale riferimento.