2011-12-30 34 views
27

Sono nuovo in java.Perché non è necessaria una nuova parola chiave per String

in Java, String è un class .Ma non dobbiamo usare new parola chiave per creare un oggetto della classe String dove, come new viene utilizzato per la creazione di oggetti per le altre classi.

Ho sentito parlare di classi Wrapper come Integer, Double che sono simili a questo. Ma il String non è Wrapper, vero?

In realtà ciò che sta accadendo quando uso

 String message = "Hai"; 

?? Come è diverso da

String message = new String("Hai"); 

Ecco message una variabile di riferimento o qualcos'altro ?? Ci sono altre classi che non richiedono new per creare oggetto ??

+0

sonu thomas :)! – jenuine

+0

@jenuine hmmmm .... –

risposta

22

Con la seguente riga non si sta creando un nuovo oggetto String nel mucchio, ma riutilizzando una stringa letterale (se disponibili):

String message = "Hai"; 

"Hai" è una stringa letterale in piscina letterale stringa. Poiché le stringhe sono immutabili, sono riutilizzabili e quindi vengono raggruppate nel pool letterale di stringhe dalla JVM. E questo è il modo consigliato, perché lo stai riutilizzando.

Ma, con il seguente in realtà si sta creando un nuovo oggetto (nel mucchio):

String message = new String("Hai"); 

new String("Hai") è un nuovo String oggetto. In questo caso, anche se il letterale "Hai" era già nel lotto letterale stringa, viene creato un nuovo oggetto. Questo non è raccomandato perché è probabile che si possa finire con più di uno String oggetti con lo stesso valore.

vedere anche questo post: Questions about Java's String pool

Esistono altre classi che non richiedono nuova per creare l'oggetto ??

In realtà, non è possibile creare alcun oggetto in Java senza utilizzare la parola chiave new.

ad es.

Integer i = 1; 

fa, non significa che l'oggetto Integer si crea senza utilizzare new. Semplicemente non è necessario per noi utilizzare esplicitamente la parola chiave new. Ma sotto il cofano, se l'oggetto Integer con valore 1 non esiste già nella cache (gli oggetti Integer vengono memorizzati nella cache da JVM), per crearlo verrà utilizzata la parola chiave new.

+0

Penso che "Integer" sia una classe Wrapper per il tipo primitivo "int". ma la stringa è ** non ** primitiva, non è vero? –

+1

Sì, hai ragione. –

6

La creazione di stringhe e interi è diversa.

String s = "Test"; 

Qui l'operatore '=' è sovraccarico per stringa. Così è l'operatore '+' in "alcuni" + "oggetti". Dove, come,

Integer i = 2; 

Fino Java 5.0 questo è compilazione errore di tempo; non puoi assegnare primitive al suo wrapper. Ma da Java 5.0 questo è chiamato auto-boxing in cui le primitive sono auto-promosse ai loro wrapper, ovunque richiesto.

String h1 = "hi"; 

sarà diverso da

String h2 = new String("hi"); 

Il motivo è che la JVM mantiene una tabella di stringhe per tutte le stringhe. quindi ci sarà una voce nella tabella per "ciao", diciamo che il suo indirizzo è 1000.

Ma quando si crea in modo esplicito un oggetto stringa, verrà creato un nuovo oggetto, diciamo che il suo indirizzo è 2000. Ora il nuovo oggetto sarà punto per la voce nella tabella di stringhe, che è 1000.

Quindi quando si dice

h1 == h2 

si confronta

1000 == 2000 

Quindi è falso

+1

L'operatore '=' è * NON * sovraccarico. Java fornisce dello zucchero sintattico per le stringhe, quindi quando scrivi "Hello, World", ottieni un riferimento a un oggetto 'String' che rappresenta il flusso di caratteri specificato. Stai implicitamente creando un oggetto (se necessario) lì, ma questo non ha niente a che fare con l'operatore '='. – Darkhogg

8

Le specifiche del linguaggio Java consentono la rappresentazione di una stringa come letterale. Si può considerare un'inizializzazione collegamento per una stringa che ha un importante effetto collaterale che è diverso da inizializzazione normale tramite nuovi

Le stringhe sono tutti internati, il che significa che essi sono valori costanti memorizzati dal Java runtime e può essere condiviso su più classi.Ad esempio:

class MainClass (
    public String test = "hello"; 
} 

class OtherClass { 
    public String another = "hello"; 

    public OtherClass() { 
     MainClass main = new MainClass(); 
     System.out.println(main.test == another); 
    } 
} 

Stampa "true" poiché entrambe le istanze String puntano effettivamente allo stesso oggetto. Questo non sarebbe il caso se inizializzate le stringhe tramite la nuova parola chiave .

+1

+1. Bello e succinto. Dovremmo menzionare la specifica del linguaggio Java disponibile gratuitamente all'indirizzo http: //java.sun.com/docs/books/jls/se OP vuole davvero tuffarsi in questo. –

1

in Java
"==" confronta le sinistre & locazioni di memoria di destra lati della mano (e non il valore in quella posizione di memoria) e quindi in caso di

new String("hai")==new String("hai")

restituisce false.

In caso di "Hai" == "Hai", java non alloca memoria separata per la stessa stringa letterale, quindi qui "==" restituisce true. È sempre possibile utilizzare il metodo equals per confrontare i valori.

Problemi correlati