Java Languagestringhe

introduzione

Le stringhe ( java.lang.String ) sono pezzi di testo memorizzati nel tuo programma. Le stringhe non sono un tipo di dati primitivi in ​​Java , tuttavia, sono molto comuni nei programmi Java.

In Java, le stringhe sono immutabili, il che significa che non possono essere modificate. (Fare clic qui per una spiegazione più approfondita dell'immutabilità).

Osservazioni

Poiché le stringhe Java sono immutabili , tutti i metodi che manipolano una String restituiranno un nuovo oggetto String . Non cambiano la String originale. Ciò include i metodi di sottostringa e di sostituzione che i programmatori C e C ++ si aspettano di modificare l'oggetto String destinazione.


Utilizzare un StringBuilder invece di String se si desidera concatenare più di due oggetti String cui valori non possono essere determinati in fase di compilazione. Questa tecnica è più performante rispetto alla creazione di nuovi oggetti String e concatenandoli perché StringBuilder è modificabile.

StringBuffer può anche essere utilizzato per concatenare oggetti String . Tuttavia, questa classe è meno performante perché è progettata per essere thread-safe e acquisisce un mutex prima di ogni operazione. Dal momento che non si ha quasi mai bisogno di thread-safe quando si concatenano le stringhe, è meglio usare StringBuilder .

Se puoi esprimere una concatenazione di stringhe come una singola espressione, allora è meglio usare l'operatore + . Il compilatore Java convertirà un'espressione contenente + concatenazioni in una sequenza efficiente di operazioni utilizzando String.concat(...) o StringBuilder . Il consiglio di usare StringBuilder esplicitamente si applica solo quando la concatenazione coinvolge più espressioni.


Non memorizzare informazioni sensibili nelle stringhe. Se qualcuno è in grado di ottenere un dump della memoria della tua applicazione in esecuzione, sarà in grado di trovare tutti gli oggetti String esistenti e leggerne il contenuto. Ciò include oggetti String non raggiungibili e in attesa di garbage collection. Se questo è un problema, è necessario cancellare i dati sensibili delle stringhe non appena ne hai finito. Non puoi farlo con gli oggetti String poiché sono immutabili. Pertanto, è consigliabile utilizzare un oggetto char[] per conservare dati di carattere sensibili e pulirli (ad es. Sovrascriverli con caratteri '\000' ) una volta terminato.


Tutte le istanze String vengono create nell'heap, anche le istanze corrispondenti ai valori letterali stringa. La particolarità dei valori letterali delle stringhe è che la JVM garantisce che tutti i letterali uguali (ovvero che siano costituiti dagli stessi caratteri) siano rappresentati da un singolo oggetto String (questo comportamento è specificato in JLS). Questo è implementato dai caricatori di classi JVM. Quando un programma di caricamento classe carica una classe, analizza i valori letterali stringa utilizzati nella definizione di classe, ogni volta che ne rileva uno, controlla se esiste già un record nel pool di stringhe per questo valore letterale (utilizzando il valore letterale come chiave) . Se esiste già una voce per il letterale, viene utilizzato il riferimento a un'istanza di String archiviata come coppia per quel letterale. Altrimenti, viene creata una nuova istanza String e un riferimento all'istanza viene archiviato per il letterale (utilizzato come chiave) nel pool di stringhe. (Vedi anche internamento stringa ).

Il pool di stringhe viene tenuto nell'heap Java ed è soggetto alla normale garbage collection.

Java SE 7

Nelle versioni di Java precedenti a Java 7, il pool di stringhe era contenuto in una parte speciale dello heap nota come "PermGen". Questa parte è stata raccolta solo occasionalmente.

Java SE 7

In Java 7, il pool di stringhe è stato spostato da "PermGen".

Si noti che i valori letterali stringa sono implicitamente raggiungibili da qualsiasi metodo che li utilizza. Ciò significa che gli oggetti String corrispondenti possono essere raccolti solo se il codice stesso è garbage collector.


Fino a Java 8, gli oggetti String vengono implementati come un array di dati UTF-16 (2 byte per carattere). C'è una proposta in Java 9 per implementare String come array di byte con un campo flag di codifica per notare se la stringa è codificata come byte (LATIN-1) o chars (UTF-16).

stringhe Esempi correlati