"" es una cadena real, aunque vacía.
nulo, sin embargo, significa que la variable String no apunta a nada.
a==b
devuelve falso porque "" y nulo no ocupan el mismo espacio en la memoria; en otras palabras, sus variables no apuntan a los mismos objetos.
a.equals(b)
devuelve falso porque "" no es igual a nulo, obviamente.
Sin embargo, la diferencia es que, dado que "" es una cadena real, aún puede invocar métodos o funciones como
a.length()
a.substring(0, 1)
y así.
Si la cadena es igual a nula, como b, Java arrojaría a NullPointerException
si intentara invocar, diga:
b.length()
Si la diferencia sobre la que se está preguntando es == versus igual, es esta:
== compara referencias, como si fuera
String a = new String("");
String b = new String("");
System.out.println(a==b);
Eso daría como resultado falso porque asigné dos objetos diferentes, y a y b apuntan a objetos diferentes.
Sin embargo, a.equals(b)
en este caso devolvería verdadero, porque equals
para cadenas devolverá verdadero si y solo si el argumento Cadena no es nulo y representa la misma secuencia de caracteres.
Sin embargo, tenga en cuenta que Java tiene un caso especial para Strings.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Se podría pensar que la salida sería false
, ya que debería asignar dos cadenas diferentes. En realidad, Java internará cadenas literales (las que se inicializan como a y b en nuestro ejemplo). Así que tenga cuidado, porque eso puede dar algunos falsos positivos sobre cómo == funciona.
b.equals(a)
, pero no lo use==
para comparar cadenas como "no funcionará" de otras maneras. Elnull
valor (que es diferente de una cadena vacía""
, una instancia de cadena válida) nunca puede tener un método invocado. Colocar el "no nulo conocido" (generalmente un valor constante o literal) al lado izquierdo de la igualdad es "Yoda condicionales" o algo así.