"" - це фактичний рядок, хоча і порожній.
null, однак, означає, що змінна String вказує ні на що.
a==b повертає false, оскільки "" та null не займають однакового простору в пам'яті - іншими словами, їх змінні не вказують на однакові об'єкти.
a.equals(b) повертає false, тому що "" очевидно не дорівнює нулю.
Різниця полягає в тому, що оскільки "" є фактичним рядком, ви все одно можете викликати методи або функції на ньому
a.length()
a.substring(0, 1)
і так далі.
Якщо рядок дорівнює нулю, як b, Java викине a, NullPointerExceptionякщо ви спробуєте викликати, скажіть:
b.length()
Якщо різниця, про яку ви задаєтесь питанням, == проти рівної, це така:
== порівнює посилання, як би я пішов
String a = new String("");
String b = new String("");
System.out.println(a==b);
Це виводитиметься помилково, оскільки я виділив два різні об’єкти, а а і b вказують на різні об'єкти.
Однак a.equals(b)у цьому випадку повернеться true, тому що equalsдля Strings повернеться true і тоді, і лише тоді, коли аргумент String не буде нульовим і являє собою ту саму послідовність символів.
Попереджуйте, що у Java є особливий випадок для Strings.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Ви можете подумати, що результат буде false, оскільки він повинен виділити дві різні рядки. Насправді, Java буде інтернувати буквальні рядки (ті, які ініціалізуються як a і b у нашому прикладі). Тож будьте обережні, бо це може дати помилкові позитиви щодо того, як == працює.
b.equals(a)- але не використовуйте==для порівняння рядків, оскільки "це не працюватиме" іншими способами.nullЗначення (яке відрізняється від порожнього рядка"", правильний екземпляр String) не може і НЕ мати метод викликається на нього. Розміщення "відомого ненульового" (як правило, постійного значення чи буквального) в ліву частину рівності - "Yoda conditionals" або якесь таке.