"" è una stringa effettiva, sebbene vuota.
null, tuttavia, significa che la variabile String non punta a nulla.
a==b
restituisce false perché "" e null non occupano lo stesso spazio in 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 è che dal momento che "" è una stringa effettiva, puoi comunque invocare metodi o funzioni su di essa come
a.length()
a.substring(0, 1)
e così via.
Se la stringa è nulla, come b, Java lancerebbe a NullPointerException
se si provasse a invocare, dire:
b.length()
Se la differenza che ti stai chiedendo è == contro uguale, è questa:
== confronta i riferimenti, come se fossi andato
String a = new String("");
String b = new String("");
System.out.println(a==b);
Ciò darebbe falso perché ho allocato due oggetti diversi e aeb puntano a oggetti diversi.
Tuttavia, a.equals(b)
in questo caso restituirà true, poiché equals
per String restituirà true se e solo se l'argomento String non è null e rappresenta la stessa sequenza di caratteri.
Tieni presente, tuttavia, che Java ha un caso speciale per le stringhe.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Si potrebbe pensare che l'output sarebbe false
, poiché dovrebbe allocare due stringhe diverse. In realtà, Java eseguirà internamente stringhe letterali (quelle inizializzate come aeb nel nostro esempio). Quindi fai attenzione, perché ciò può dare alcuni falsi positivi su come funziona ==.
b.equals(a)
- ma non utilizzare==
per il confronto di stringhe in quanto "non funzionerà" in altri modi. Alnull
valore (che è diverso da una stringa vuota""
, un'istanza String valida) non può mai essere invocato un metodo su di esso. Posizionare il "noto non nullo" (di solito un valore costante o letterale) sul lato sinistro dell'uguaglianza è "Yoda conditionals" o qualcos'altro.