"" - це фактичний рядок, хоча і порожній.
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" або якесь таке.