"" è 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.
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. –