"" - это действительная строка, хотя и пустая.
Однако 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) никогда не может быть вызван метод. Поместить «известный ненулевой» (обычно постоянное значение или литерал) в левую часть равенства - это «условные выражения Йоды» или что-то в этом роде.