2016-02-19 14 views
7

Voglio capire il pool di stringhe più profondamente. Per favore aiutami ad arrivare al file di classe sorgente contenente questa implementazione in Java.In che modo Java implementa il pooling di stringhe?

La domanda è più legata al trovare il codice sorgente o l'implementazione del pool di stringhe per approfondire questo concetto per saperne di più su alcune cose sconosciute o elusive in esso. In questo modo possiamo rendere l'uso delle stringhe ancora più efficiente o pensare in qualche altro modo di implementare le nostre raccolte di dati inutili nel caso in cui avessimo un'applicazione che crea così tanti letterali e oggetti stringa.

+0

Non si capirà meglio il pool di stringhe guardando il codice effettivo. Fondamentalmente, è una specie di mappa hash.Nello specifico, la JVM sa che questa speciale mappa supporta ancora la garbage collection per le stringhe contenute. Se capisci questi principi, non c'è bisogno di guardare il codice. D'altra parte, se non capisci, il codice non ti aiuterà. – Holger

+0

@Holger Ok. So del funzionamento di hashmap. cercavo ancora qualcosa di "non letto" da me, osservando l'effettiva implementazione. –

risposta

4

Si può passare attraverso questo articolo: Strings, Literally

Quando un file .java viene compilato in un file .class, eventuali stringhe letterali sono noti in modo speciale, proprio come tutte le costanti sono. Quando una classe è caricata con (nota che il caricamento avviene prima dell'inizializzazione), la JVM passa attraverso il codice per la classe e cerca i valori letterali String. Quando ne trova uno, controlla se una stringa equivalente è già a cui viene fatto riferimento dall'heap. In caso contrario, crea un'istanza String nell'heap e memorizza un riferimento a quell'oggetto nella tabella costante. Una volta che viene fatto riferimento a tale oggetto String, qualsiasi riferimento a quello letterale stringa in tutto il programma viene semplicemente sostituito con il riferimento all'oggetto a cui fa riferimento il lotto di stringhe letterale.

Quindi, nell'esempio illustrato sopra, nel pool letterale si troverà una sola voce, che farebbe riferimento a un oggetto String che contenesse la parola "someString". Entrambe le variabili locali, uno e due, verrebbero assegnati a un riferimento a quel singolo oggetto String. È possibile vedere che questo è vero guardando guardando l'output del programma precedente. Mentre il metodo equals() controlla se gli oggetti String contengono gli stessi dati ("someString"), l'operatore ==, quando viene utilizzato sugli oggetti , verifica l'uguaglianza referenziale - ciò significa che sarà restituito true se e solo se le due variabili di riferimento si riferiscono allo stesso identico oggetto . In tal caso, i riferimenti sono uguali. Dall'output di sopra, è possibile notare che le variabili locali, una e due, non si riferiscono solo a stringhe che contengono gli stessi dati, si riferiscono allo stesso oggetto .

+0

Citazione di scarsa qualità: numerosi errori e l'implementazione è cambiata nel tempo. Ad esempio, gran parte del lavoro è svolto dal compilatore, non dalla JVM, e la JVM esamina la tabella costante nel file .class, non il bytecode. – EJP

14

Mi dispiace deluderti, ma il Java String-Pool non è una vera classe Java, ma da qualche parte implementato in JVM, è scritto come codice C++. Se si guarda allo source code of the String class (praticamente fino in fondo) si vede che il metodo intern() è nativo. Dovrai passare attraverso un codice JVM per ottenere maggiori informazioni.

Modifica: Alcune implementazioni possono essere trovate qui (C++ header, C++ implementation). Cerca StringTable.

Edit2: come Holger ha sottolineato nei commenti, questo non è un requisito fondamentale dell'implementazione JVM. Quindi è possibile avere una JVM che implementa il pool di stringhe in modo diverso, ad es. usando una vera classe Java. Sebbene tutte le JVM di uso comune siano a conoscenza dell'implementazione nel codice C++ di JVM.

+0

Grazie per l'informazione. Sì nel codice sorgente il metodo è nativo. Puoi fornire un link da cui posso scaricare il codice sorgente nativo. –

+0

Non ero sicuro che sia scritto in C o C++ ^^ Ma in realtà è C++ quindi lo aggiusterò. – MartinS

+1

@ Ankit_ceo2 dovresti riuscire a scaricarlo qui http://download.java.net/openjdk/jdk7/ – MartinS

Problemi correlati