2012-05-25 15 views
8
String h = "hi"; 

qui si fa riferimento alla stringa h alla stringa letterale hi. JVM dispone di un pool letterale di stringhe per memorizzare stringhe letterali in modo da poter riutilizzare le stringhe come immutabili ...Riusabilità di archi in java?

Quando si dice reusable, qual è il significato esatto di questo? stiamo parlando dello address? che viene prelevato dallo stesso indirizzo ogni volta?

+0

Penso che la risposta è sì. –

risposta

6

Sì, per rendere le cose più semplici si può pensare ad esso come prelevamento dallo stesso indirizzo, ma per essere più precisi le variabili mantengono lo stesso riferimento - identificatore che JVM può utilizzare per mappare correttamente l'indirizzo di memoria dell'oggetto (poiché gli oggetti possono essere spostati in memoria).

È possibile effettuare delle prove codice come questo:

String w1 = "word"; 
String w2 = "word"; 
String b = new String("word"); // explicitly creating String by calling `new` operator 
           // won't put it in string pool 
System.out.println(w1 == w2); // true -> variables hold same reference 
System.out.println(w1 == b); // false -> variable hold different references 
b = b.intern(); // check if pool contains this string, if not put this string in pool, 
       // then return reference of such string from pool and store it in b variable 
System.out.println(w1 == b); // true -> now w1 and b hold same reference 
+0

b = b.intern(); // metti una stringa in pool di stringhe, restituiscile dal pool, quindi memorizzala in b refrence .... mettila in piscina ok resto non capita :( – Nil

+0

Ho bisogno di memorizzare un valore di condivisione dati da 'b.intern()' perché La stringa è immutabile (non può essere modificata) quindi faccio 'b = b.intern()' questo è il motivo per cui ho scritto "memorizzalo in b refrence" – Pshemo

+0

Stavo solo leggendo alcune cose .. quando dici che la stringa non può essere cambiata una volta è creato, cosa vuol dire? [scusate 4 domande amatoriali] – Nil

8

Nel caso di

String h = "hi"; 
String i = "hi"; 
String j = new String("hi"); 

seconda della versione del JDK compilatore può fare ciò che è chiamato interning e creare una singola istanza del byte di dati che rappresenta la "hi" e riutilizzarlo tra la a riferimenti variabili. Nelle specifiche più recenti, tutti gli String literals sono internati nel pool di stringhe nella generazione permanente.

L'utilizzo della parola chiave new come nell'ultima istruzione creerà una nuova istanza degli stessi identici byte di un oggetto separato.

oggetti String creati a runtime sono non nel pool di stringa a meno che .intern() si chiama su di loro. This is usually not needed and can cause problems, rarely has any significant benefits.

h == i; // true 
h == j; // false 
j.intern(); 
h == j; // true 
+0

Stringa h = "hi"; e String i = new String ("hi"); .... succede qualcosa di diverso in questo caso? – Nil

+0

in modo che il contenuto "hi" di h e i sia memorizzato in un indirizzo e il contenuto "hi" dell'oggetto j sia memorizzato in un altro indirizzo sono corretto? – Nil

4

cosa si intende è che se 20 oggetti utilizzano la stessa stringa letterale:

private String h = "hi"; 

tutti questi oggetti verranno infatti riferimento alla stessa istanza String in memoria. E non importa, perché è impossibile cambiare il contenuto della String, dal momento che è immutabile. La stessa istanza può quindi essere condivisa senza problemi tra gli oggetti.

3

C'è un pool letterale String all'interno della JVM con tutti gli String s creati durante la vita del programma. Riutilizzabile, si intende che, quando si desidera utilizzare un altro String con esattamente gli stessi caratteri e la codifica, non viene creato un nuovo oggetto String. Invece, il riferimento punterà allo String già esistente nel pool di stringhe. Questo è chiamato internare.

Questo è possibile perché String s sono immutabili in Java.

La ragione per fare qualcosa di simile è evitare il costo della creazione di un nuovo oggetto String.

Guardate qui per maggiori dettagli su ciò che la piscina letterale String è e come funziona: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

Inoltre, guarda questa domanda: Shouldn't I do `String s = new String("a new string");` in Java, even with automatic string interning?