"" - это действительная строка, хотя и пустая.
Однако null означает, что переменная String ни на что не указывает.
a==b возвращает false, потому что "" и null не занимают одно и то же место в памяти - другими словами, их переменные не указывают на одни и те же объекты.
a.equals(b) возвращает false, потому что "" не равно нулю, очевидно.
Разница заключается в том, что, поскольку "" является действительной строкой, вы все равно можете вызывать методы или функции, например:
a.length()
a.substring(0, 1)
и так далее.
Если String равно null, как b, Java выдаст a, NullPointerExceptionесли вы попытаетесь вызвать, скажем:
b.length()
Если разница, которая вас интересует, равна == против равных, то это:
== сравнивает ссылки, как будто я пошел
String a = new String("");
String b = new String("");
System.out.println(a==b);
Это вывело бы false, потому что я выделил два разных объекта, а a и b указывают на разные объекты.
Однако a.equals(b)в этом случае будет возвращено значение true, поскольку equalsдля Strings будет возвращаться значение true в том и только в том случае, если аргумент String не является нулевым и представляет одинаковую последовательность символов.
Однако следует помнить, что в Java есть особый случай для строк.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Вы могли бы подумать, что вывод будет false, так как он должен выделить две разные строки. Фактически, Java будет интернализировать буквальные строки (те, которые инициализируются как a и b в нашем примере). Так что будьте осторожны, потому что это может дать некоторые ложные срабатывания о том, как == работает.
b.equals(a)- но не используйте==для сравнения строк, так как «это не сработает» другими способами. Уnullзначения (которое отличается от пустой строки"", допустимого экземпляра String) никогда не может быть вызван метод. Поместить «известный ненулевой» (обычно постоянное значение или литерал) в левую часть равенства - это «условные выражения Йоды» или что-то в этом роде.