2011-01-26 22 views
104

Qual è la differenza tra null e "" (stringa vuota)?Differenza tra stringa vuota e stringa vuota ("")

Ho scritto un certo codice semplice:

String a = ""; 
String b = null; 

System.out.println(a==b); // false 
System.out.println(a.equals(b)); // false 

Entrambe le affermazioni ritorno false. Sembra, non sono in grado di trovare qual è la differenza effettiva tra di loro.

+5

Confronta con 'b.equals (a)' - ma non utilizzare '==' per la stringa che confronta come "non funzionerà" in altri modi. Il valore 'null' (che è diverso da una stringa vuota' "" ', un'istanza String valida) può * mai * avere un metodo invocato su di esso. Posizionando il "noto non nullo" (di solito un valore costante o letterale) sul lato sinistro dell'uguaglianza è "condizionali Yoda" o alcuni-tali. –

risposta

175

"" è una stringa effettiva, anche se vuota.

null, tuttavia, indica che la variabile String non punta a nulla.

a==b restituisce false perché "" e null non occupano lo stesso spazio nella memoria, in altre parole, le loro variabili non puntano agli stessi oggetti.

a.equals(b) restituisce false perché "" non è uguale a null, ovviamente.

La differenza è però che dal momento che "" è una stringa effettiva, è ancora possibile invocare metodi o funzioni su di esso come

a.length()

a.substring(0, 1)

e così via.

Se la stringa è uguale a zero, come b, Java sarebbe lanciare una NullPointerException se si è tentato invocare, dicono:

b.length()


Se la differenza vi state chiedendo circa è == rispetto uguale, è questo:

== confronta i riferimenti, come se andassi

String a = new String(""); 
String b = new String(""); 
System.out.println(a==b); 

Questo risulterebbe falso perché ho assegnato due oggetti diversi, e un punto e b a oggetti diversi.

Tuttavia, a.equals(b) in questo caso sarebbe tornato vero, perché equals per archi restituirà true if and only if the argument String is not null and represents the same sequence of characters.

Attenzione, però, che Java non ha un caso speciale per archi.

String a = "abc"; 
String b = "abc"; 
System.out.println(a==b); 

si potrebbe pensare che l'uscita sarebbe false, dal momento che dovrebbe assegnare due stringhe differenti. In realtà, Java sarà Stringhe letterali intern (quelle inizializzate come aeb nel nostro esempio). Quindi, fai attenzione, perché ciò può dare alcuni falsi positivi su come == funziona.

+0

Questo vale anche per C#? Come nella matrice "" l'array è {'\ 0'}, un valore nullo –

+3

Il collegamento su 'intern' è scaduto. Puoi fare riferimento a un altro sito per leggerlo al riguardo: https://weblogs.java.net/blog/enicholas/archive/2006/06/all_about_inter.html – Stallman

+0

Quindi, se ho una stringa nullo 'String a = null' e poi io ** aggiungo ** una stringa come 'a + =" esempio "', quando la stampo, perché visualizza 'nullexample' se null non è una stringa? – PinaGamer

7

qui a is an Object ma b(null) è non un oggetto è un riferimento null

System.out.println(a instanceof Object); // true 

System.out.println(b instanceof Object); // false 

here is mia risposta simile

+1

Sia 'a' che' b' sono riferimenti. 'a' è un riferimento con un oggetto istanziato. 'b' è un riferimento senza oggetto istanziato (da cui il termine" riferimento null "). –

+0

Ho contrastato il -1 ;-) Ma sarebbe utile per chiarire questa risposta e discutere la differenza tra "un oggetto" e il valore "null" e la differenza tra oggetti e variabili. –

+0

@ pst, quindi perché -1? :) –

13

String è un oggetto e può essere nullo

nullo significa che il L'oggetto String non è stato istanziato

"" è un valore effettivo della stringa oggetto istanziato come "aaa"

Ecco un link che potrebbe chiarire che punto http://download.oracle.com/javase/tutorial/java/concepts/object.html

+0

"null significa che l'oggetto stringa non è stato istanziato" - grazie! questo mi aiuta a capire molto le cose. Sono stato in grado di usare un'istruzione if su un oggetto MediaPlayer una volta, e ha funzionato per usare null, per verificare se era in esecuzione o meno (con un metodo per eseguire se lo era), ma non ho mai capito perché ha funzionato, ma ora Vedo cosa stavo dicendo, stavo controllando se MediaPlayer fosse stato istanziato o meno, usando null ... per esempio 'if (mp == null) {do something}'. – Azurespot

8

C'è una differenza abbastanza significativa tra i due. La stringa vuota "" è "la stringa che non contiene caratteri". È una stringa vera e propria che ha una lunghezza ben definita. Tutte le operazioni di stringa standard sono ben definite sulla stringa vuota: è possibile convertirle in minuscolo, cercare l'indice di un carattere in esso, ecc. La stringa nulla null è "nessuna stringa". Non ha una lunghezza perché non è affatto una stringa. Provare ad applicare qualsiasi operazione di stringa standard alla stringa nulla causerà un NullPointerException in fase di esecuzione.

10

Ciò che le tue affermazioni ti dicono è che "" non è uguale a null - che è vero. "" è una stringa vuota; null significa che nessun valore è stato assegnato.

Potrebbe essere più illuminante da provare:

System.out.println(a.length()); // 0 
System.out.println(b.length()); // error; b is not an object 

"" è ancora una stringa, significa che è possibile chiamare i suoi metodi e ottenere informazioni significative. null è una variabile vuota - non c'è letteralmente niente lì.

4

In Java un tipo di riferimento assegnato null ha nessun valore. Una stringa assegnata a "" ha un valore: una stringa vuota, ovvero una stringa senza caratteri. Quando viene assegnata una variabile null, significa che non esiste alcun oggetto sottostante di alcun tipo, stringa o altro.

6

null significa che il nome non fa riferimento a nessun oggetto istanziato. "" indica una stringa vuota.

Qui un fa riferimento a qualche oggetto che risulta essere una stringa vuota. b non fa riferimento a nessun oggetto poiché è null.

1

La stringa vuota è distinto da un riferimento nullo dal fatto che in un linguaggio di programmazione orientata agli oggetti un nullo riferimento ad un tipo stringa non indica un oggetto stringa e causerà un errore erano uno per provare a eseguire qualsiasi operazione su di esso. La stringa vuota è ancora una stringa su cui è possibile tentare le operazioni di stringa .

Dall'articolo di Wikipedia su empty string.

2

"" e null entrambi sono diversi. il primo indica come parte della dichiarazione di variabili stringa che la costante di stringa è stata creata nel pool di stringhe e che è stata assegnata della memoria per lo stesso.

Ma quando lo stiamo dichiarando con null quindi è stato appena istanziato jvm, ma non è stata allocata memoria per esso. pertanto, se stai tentando di accedere a questo oggetto controllandolo con "" - variabile vuota, non è possibile impedire l'osservazione di nullpoint. Si prega di trovare sotto un caso d'uso.

public class StringCheck { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String s1 = "siddhartha"; 
    String s2 = ""; 
    String s3 = null; 

    System.out.println("length s1 ="+s1.length()); 
    System.out.println("length s2 ="+s2.length()); 

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){ 
     System.out.println("length s3 ="+s3.length()); 
    } 
} 

}

3
String s = ""; 
s.length(); 

String s = null; 
s.length(); 

Un riferimento a una stringa vuota "" punti ad un oggetto nel mucchio - così si può chiamare metodi su questo.

Ma un riferimento che punta a null non ha alcun oggetto da puntare nell'heap e quindi otterrete uno NullPointerException.

0

Una stringa può essere vuota o avere un valore null. Se una stringa è null, non si riferisce a nulla in memoria. Prova s.length()>0. Questo perché se una stringa è vuota, restituisce ancora una lunghezza pari a 0. Quindi, se non si immette nulla per lo stesso, continuerà comunque il ciclo poiché non registra la stringa come null. Mentre se controlli la lunghezza, uscirà dal ciclo.

66

Si può anche comprendere la differenza tra stringa nulla e vuota questo modo:

Difference between null and 0/empty string

0

Questo concetto può essere meglio compreso dalla matematica. Hai mai provato a dividere un numero (non zero) per 0 utilizzando una calcolatrice, ad esempio 7/0? Otterrai un risultato che assomiglierà a qualcosa: undefined, not a number, null ecc. Ciò significa che l'operazione è impossibile, per alcuni motivi (lasciamo che tali motivi siano discussi un altro giorno).

Ora, eseguire questo: 0/7. Otterrai l'output 0. Ciò significa che l'operazione è possibile e può essere eseguita, ma la risposta è solo 0 perché nulla è rimasto dopo la divisione. C'è un output valido e quell'output è zero.

Nel primo esempio, non solo l'output non era valido, l'operazione non era possibile eseguire. Questo è simile alla stringa null in Java. Il secondo esempio è simile alla stringa empty.