"" 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 NullPointerExceptionsi 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 equalspara 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. Elnullvalor (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í.