2014-04-23 6 views
16

Questa domanda potrebbe essere sciocca. Ma sono completamente confuso. Hai bisogno di aiuto per capire il pool di stringhe e il pool costante. Sono a conoscenza dell'internazionalizzazione delle stringhe e del pool di stringhe.Pool di stringhe vs Pool costante

String s1 = "Hello"; 
    String s2 = "Hello"; 

Ora sia riferisce allo stesso oggetto a causa di interning. (Cioè) Poiché le stringhe no viene creato un solo oggetto ed entrambe si riferiscono allo stesso oggetto.

E anche pool costante è qualcosa che contiene tutte le costanti (numero intero, stringa, ecc.) Dichiarate in una classe. È specifico per ogni classe.

System.out.println("Hello"); //I believe this Hello is different from above. 

Le mie domande sono,

  1. Does piscina stringa fa riferimento al pool dell'oggetto stringa costante in piscina costante?
  2. Se sì, è Pool di stringhe comune in tutte le applicazioni o specifico per una classe?

Grazie.

+0

https://stackoverflow.com/questions/5457146/regarding-java-string-constant-pool?rq=1 – Brian

+0

possibile duplicato del [Quando dovremmo usare il metodo stagista della stringa su costanti stringa] (http: //stackoverflow.com/questions/1855170/when-should-we-use-intern-method-of-string-on-string-constants) – Deduplicator

risposta

11

Le mie domande sono,

  1. Does piscina stringa fa riferimento al pool dell'oggetto stringa costante in piscina costante?

No.

"pool costante" si riferisce ad una collezione appositamente formattato di byte in un file di classe che ha un significato alla classe loader Java. Le "stringhe" in esso sono serialized, non sono oggetti Java. Ci sono anche molti tipi di costanti, non solo archi in esso.

Vedi Chapter 4.4 the constant pool table

Java Virtual Machine istruzioni non si basano sul layout in fase di esecuzione di classi, interfacce, istanze di classe, o array. Invece, le istruzioni si riferiscono alle informazioni simboliche nella tabella constant_pool.

Al contrario, il "pool stringa" viene utilizzato in fase di esecuzione (non solo durante il caricamento delle classi), contiene solo stringhe, e le "stringhe" nel pool di stringa sono oggetti Java. Il "pool di stringhe" è una mappa debole sicura da thread dalle istanze java.lang.String alle istanze java.lang.String utilizzate per le stringhe interne.

Chapter 3.10.5. String Literals dice

Una stringa letterale è un riferimento a un'istanza di classe String (§4.3.1, §4.3.3).

Inoltre, una stringa letterale fa sempre riferimento alla stessa istanza della classe String. Questo perché stringhe letterali - o, più in generale, stringhe che sono i valori delle espressioni costanti (§15.28) - sono "internate" in modo da condividere istanze uniche, usando il metodo String.intern.

+1

Dove è memorizzato questo pool di stringhe? Come link http://java-performance.info/string-intern-in-java-6-7-8/ afferma che le stringhe internate sono archiviate nell'heap. Quindi è lo stesso cumulo di dove si trovano gli altri oggetti o diversi? Sarebbe gradito qualsiasi link a javadocs o alle specifiche java. – nanosoft

+2

@nanosoft, con un garbage collector generazionale, i nuovi oggetti sono allocati nella [nursery] (https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html#wp1085825), ma le stringhe internate di solito sono longeve, quindi un'implementazione potrebbe saltare l'asilo nido per le stringhe assegnate dai caricatori di classe. Se una JVM esegue questa operazione è una decisione di implementazione e non è richiesta dalla * Java Virtual Machine Specification *. La * lingua ** ** ** specifica * è l'altra metà della specifica Java, ma principalmente delegata alla specifica JVM su questioni di gestione della memoria. –

3

C'è un solo pool di stringhe e tutti i valori letterali di stringa sono internati automaticamente.
Inoltre, ci sono altri pool per l'autoboxing e così via.

La piscina costante è quella in cui questi valori letterali vengono assegnati alla classe.