"" - это действительная строка, хотя и пустая.
null, однако, означает, что переменная String указывает на ничто.
a==b
возвращает false, потому что "" и null не занимают одно и то же место в памяти - другими словами, их переменные не указывают на одни и те же объекты.
a.equals(b)
возвращает false, потому что "" не равно нулю, очевидно.
Разница в том, что, так как "" является реальной строкой, вы все равно можете вызывать методы или функции для нее, например
a.length()
a.substring(0, 1)
и т. Д.
Если строка равна нулю, как b, Java выдаст 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 будет intern литеральными строками (те, которые инициализируются как a и b в нашем примере). Так что будьте осторожны, потому что это может дать некоторые ложные срабатывания о том, как == работает.