2013-07-15 15 views

risposta

1

Una stringa Java contiene una sequenza immutabile di caratteri Unicode. A differenza di C/C++, dove la stringa è semplicemente una matrice di caratteri, A Java String è un oggetto della classe java.lang. La stringa Java è, tuttavia, speciale. A differenza di una classe ordinaria:

La stringa è associata a stringhe letterali sotto forma di testi con doppie virgolette come "Hello, world!". È possibile assegnare una stringa letterale direttamente a una variabile String, anziché chiamare il costruttore per creare un'istanza String.

String s1 = "Hello";    // String literal 
String s2 = "Hello";    // String literal 
String s3 = s1;     // same reference 
String s4 = new String("Hello"); // String object 
String s5 = new String("Hello"); // String object 

How can a string be initialized using " "?

+0

Ci può dire come "Ciao" sarà internato in piscina String? Non verrà chiamato nessun costruttore? – NINCOMPOOP

+2

Questo è più di una discussione su come inizializzare le variabili stringa rispetto al modo in cui una stringa letterale viene convertita in un'istanza di stringa in fase di runtime, che come penso, è l'intenzione di questa domanda. – SpaceTrucker

11

Quando JVM carica una classe contenente una stringa letterale

String str = "hello"; 

si legge stringa letterale da file di classe nella codifica UTF-8 e crea un array di caratteri da esso

char[] a = {'h', 'e', 'l', 'l', 'o'}; 

th en crea un oggetto String da questo array char utilizzando String (char []) costruttore

new String(a) 

quindi JVM pone l'oggetto String in String piscina e assegna il riferimento a questo oggetto String str variabile.

+0

+1 Ottimo, dove hai trovato queste informazioni. Dovrei cancellare la mia risposta in quanto ho sbagliato che nessun costruttore è chiamato. –

+0

Si potrebbe pensare che la JVM possa usare un costruttore privato più efficiente che non deve fare una copia dell'array, comunque. – Thilo

+0

+1 Questa è la risposta corretta. – NINCOMPOOP

3

Come per la JVM 5.1 spec

Per ricavare una stringa letterale, la Java Virtual Machine esamina la sequenza di punti di codice dato dalla struttura CONSTANT_String_info.

  1. Se il metodo String.Intern è stato precedentemente definito sopra un'istanza di classe String contenente una sequenza di punti di codice Unicode identica a quella proposta dalla struttura CONSTANT_String_info, allora il risultato della stringa derivazione letterale è un riferimento quella stessa istanza della classe String.

  2. Altrimenti, una nuova istanza della classe String viene creata contenente la sequenza di punti di codice Unicode fornite dalla struttura CONSTANT_String_info; un riferimento a quell'istanza di classe è il risultato della derivazione letterale stringa. Infine, viene richiamato il metodo interno della nuova istanza String.

Quindi da questo punto possiamo dedurre il costruttore può essere:

String(int[] codePoints, int offset, int count)

alloca una nuova stringa contenente caratteri da una sottomatrice di codice argomentazione punto matrice Unicode . L'argomento offset è l'indice del primo punto di codice del sottoarray e l'argomento count specifica la lunghezza del sottoarray. I contenuti del sottoarray sono convertiti in caratteri; la successiva modifica dell'array int non influisce sulla stringa appena creata.

o può anche essere il costruttore privato:

// Package private constructor which shares value array for speed. 
String(int offset, int count, char value[]) { 
this.value = value; 
this.offset = offset; 
this.count = count; 
} 
+0

Come possiamo dedurre che questo costruttore sia chiamato? È pubblico e inefficiente (deve fare una copia dell'array). Si potrebbe pensare che la JVM possa utilizzare un costruttore privato più efficiente. – Thilo

+0

@Thilo Buona osservazione, ma non ho visto alcun costruttore 'privato' in' String' e questo costruttore si avvicina a ciò che dice il doc. – NINCOMPOOP

+1

Ce n'è uno alla Line 645 in http://hg.openjdk.java.net/jdk7/build-gate/jdk/file/tip/src/share/classes/java/lang/String.java – Thilo

Problemi correlati