„” to rzeczywisty ciąg, aczkolwiek pusty.
null oznacza jednak, że zmienna String nic nie wskazuje.
a==b
zwraca false, ponieważ „” i null nie zajmują tego samego miejsca w pamięci - innymi słowy, ich zmienne nie wskazują na te same obiekty.
a.equals(b)
zwraca fałsz, ponieważ „” oczywiście nie równa się null.
Różnica polega jednak na tym, że ponieważ „” jest rzeczywistym ciągiem znaków, nadal można wywoływać na nim metody lub funkcje
a.length()
a.substring(0, 1)
i tak dalej.
Jeśli String równa się null, na przykład b, Java wyrzuci a, NullPointerException
jeśli spróbujesz wywołać, powiedz:
b.length()
Jeśli różnica, o którą się zastanawiasz, to == versus equals, to jest to:
== porównuje odniesienia, tak jak gdybym poszedł
String a = new String("");
String b = new String("");
System.out.println(a==b);
To dałoby wynik fałsz, ponieważ przydzieliłem dwa różne obiekty, a a i b wskazują różne obiekty.
Jednak a.equals(b)
w tym przypadku zwróci wartość true, ponieważ equals
for Strings zwróci wartość true wtedy i tylko wtedy, gdy argument String nie jest null i reprezentuje tę samą sekwencję znaków.
Ostrzegamy jednak, że Java ma specjalny przypadek dla ciągów znaków.
String a = "abc";
String b = "abc";
System.out.println(a==b);
Można by pomyśleć, że wynik będzie taki false
, ponieważ powinien przydzielić dwa różne ciągi. W rzeczywistości Java ma wbudowane dosłowne ciągi znaków (takie, które są zainicjowane jak aib w naszym przykładzie). Więc bądź ostrożny, ponieważ może to dać fałszywe alarmy na temat tego, jak działa ==.
b.equals(a)
- ale nie używaj==
do porównywania ciągów, ponieważ „to nie zadziała” w inny sposób.null
Wartość (która jest inna niż pusty ciąg""
, ważny przykład String) może nie mieć metodę na niego powoływać. Umieszczenie „znanej wartości innej niż null” (zwykle stałej lub literału) po lewej stronie równości oznacza „warunkowe Yoda” lub coś takiego.