Jaka jest różnica między null
a ""
(pusty ciąg)?
Napisałem prosty kod:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
Obie instrukcje powracają false
. Wygląda na to, że nie jestem w stanie znaleźć rzeczywistej różnicy między nimi.
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.Odpowiedzi:
„” 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ł
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.
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 ==.źródło
intern
wygasł. Aby przeczytać o tym, możesz odwołać się do innej witryny: weblogs.java.net/blog/enicholas/archive/2006/06/…String a = null
a następnie dołączam do niego ciąg, na przykłada+= "example"
, kiedy go drukuję, dlaczego wyświetla się,nullexample
jeśli null nie jest ciągiem?"num: " + 20
daje ci ciąg"num: 20"
. Czy to oznacza, że20
jest to ciąg? (to nie20
jest , to liczba). To samo dotyczynull
: nie jest to ciąg, ale można go przekonwertować na jeden, jeśli spróbujesz go dodać.Możesz również zrozumieć różnicę między null a pustym ciągiem w ten sposób:
Oryginalny obraz R. Sato ( @raysato )
źródło
Ciąg jest obiektem i może mieć wartość null
null oznacza, że nie utworzono wystąpienia obiektu String
„” to rzeczywista wartość utworzonego ciągu obiektu, np. „aaa”
Oto link, który może wyjaśnić ten punkt http://download.oracle.com/javase/tutorial/java/concepts/object.html
źródło
if (mp==null){do something}
.To, co mówią twoje stwierdzenia, to po prostu to, że „” nie jest tym samym, co null - co jest prawdą. „” to pusty ciąg; null oznacza, że żadna wartość nie została przypisana.
Bardziej pouczające może być spróbowanie:
„” jest nadal ciągiem znaków, co oznacza, że możesz wywoływać jego metody i uzyskiwać znaczące informacje. null to pusta zmienna - dosłownie nic tam nie ma.
źródło
Jest między nimi dość znacząca różnica. Pusty ciąg
""
to „ciąg, który nie zawiera znaków”. To rzeczywisty ciąg o dobrze zdefiniowanej długości. Wszystkie standardowe operacje na łańcuchach są dobrze zdefiniowane na pustym łańcuchu - możesz przekonwertować go na małe litery, sprawdzić indeks jakiegoś znaku, itp. Łańcuch pustynull
to „żaden łańcuch”. Nie ma długości, ponieważ w ogóle nie jest ciągiem. Próba zastosowania dowolnej standardowej operacji na łańcuchu pustym spowoduje wystąpienieNullPointerException
atrybutu at.źródło
Tutaj
a is an Object
jednakb(null)
jest nie Object jest punktem odniesienia wartości nulloto moja podobna odpowiedź
źródło
a
ib
są referencjami.a
jest odwołaniem do instancji obiektu.b
jest odwołaniem bez utworzonego obiektu (stąd termin „odwołanie zerowe”).null
wartością oraz różnicą między obiektami i zmiennymi.null oznacza, że nazwa nie odwołuje się do żadnego utworzonego obiektu. „” oznacza pusty ciąg.
Tutaj a odwołuje się do obiektu, który jest pustym łańcuchem. b nie odwołuje się do żadnego obiektu, ponieważ jest on pusty.
źródło
W Javie przypisany typ odwołania nie
null
ma żadnej wartości . Przypisany ciąg""
ma wartość: pusty ciąg, czyli łańcuch bez znaków. Kiedy przypisana jest zmiennanull
, oznacza to, że nie ma żadnego obiektu bazowego, łańcucha lub innego.źródło
„” i null są różne. pierwsza oznacza, że jako część deklaracji zmiennej łańcuchowej została utworzona stała łańcuchowa w puli ciągów i została na nią przydzielona część pamięci.
Ale kiedy deklarujemy go z null, to właśnie utworzono instancję jvm, ale nie przydzielono dla niego pamięci. dlatego jeśli próbujesz uzyskać dostęp do tego obiektu, sprawdzając go za pomocą "" - pustej zmiennej, nie może to zapobiec wyjątkowi nullpointerexception. Poniżej znajdziesz jeden przypadek użycia.
}
źródło
Odwołanie do pustego ciągu
""
wskazuje na obiekt w stercie - można więc wywołać na nim metody.Ale odniesienie wskazujące na
null
nie ma obiektu do wskazania na stercie, więc otrzymasz plikNullPointerException
.źródło
Z artykułu w Wikipedii o pustym łańcuchu .
źródło
String s=null;
Ciąg nie jest inicjowany dla wartości null. jeśli próbowano wykonać jakąkolwiek operację na łańcuchach, może to zgłosić wyjątek wskaźnika zerowego
String t="null";
Jest to łańcuch znaków z wartością „null”, taką samą jak t = „xyz”. Nie wyrzuca pustego wskaźnika.
String u="";
Jest to pusty ciąg, nie wyrzuci wskaźnika zerowego.
źródło
Ciąg może być pusty lub mieć
null
wartość. Jeśli ciąg tonull
, to nie odnosi się do niczego w pamięci. Spróbujs.length()>0
. Dzieje się tak, ponieważ jeśli ciąg jest pusty, nadal zwraca długość 0. Więc jeśli nie wprowadzisz nic dla tego samego, nadal będzie kontynuował pętlę, ponieważ nie rejestruje łańcucha jakonull
. Natomiast jeśli sprawdzisz długość, wyjdzie ze swojej pętli.źródło
Pojęcie to można lepiej zrozumieć z matematyki. Czy kiedykolwiek próbowałeś podzielić liczbę (nie zero) przez 0 za pomocą kalkulatora, np. 7/0? Otrzymasz wynik, który wygląda jak coś to:
undefined
,not a number
,null
itp Oznacza to, że operacja jest niemożliwa, z jakichś powodów (zostawmy te powody, które będą omawiane inny dzień).Teraz wykonaj to: 0/7. Otrzymasz wynik 0. Oznacza to, że operacja jest możliwa i może zostać wykonana, ale odpowiedź brzmi 0, ponieważ po dzieleniu nic nie zostało. Istnieje prawidłowe wyjście i jest to zero.
W pierwszym przykładzie nie tylko dane wyjściowe były nieprawidłowe, ale operacja nie była możliwa do wykonania. Jest to podobne do
null
stringów w Javie. Drugi przykład jest podobny doempty
stringa.źródło
Kiedy piszesz
String a = "";
Oznacza to, że istnieje zmienna „a” typu string, która wskazuje na odniesienie do obiektu w puli ciągów, które ma wartość „”. Ponieważ zmienna
a
przechowuje prawidłowe odniesienie do obiektu typu łańcuchowego, można tu zastosować wszystkie metody łańcuchowe.Natomiast kiedy piszesz
String b = null;
Oznacza to, że istnieje zmienna
b
typu string, która wskazuje na nieznane odniesienie . Każda operacja na nieznanym odwołaniu spowoduje błądNullPointerException
.Teraz oceńmy poniższe wyrażenia.
źródło
Krótko mówiąc,
„” jest pustym ciągiem
null jest pustą zmienną łańcuchową .
źródło
Różnica między ciągiem pustym i pustym. Na przykład: masz zmienną o nazwie x. Jeśli piszesz w JS,
var x = "";
oznacza to, że przypisałeś wartość, która jest pustym ciągiem (długość wynosi 0). Właściwie to jest jak coś, ale nic nie czuć :) Z drugiej strony,
var y = null;
oznacza to, że nie przypisałeś y wartości, która została jasno określona przez zapisanie wartości null do y w momencie deklaracji. Jeśli napiszesz y.length; zwróci błąd, który wskazuje, że żadna wartość nie jest przypisana do y iw rezultacie nie może odczytać długości y.
źródło
Ten obraz może pomóc ci zrozumieć różnice.
Obraz został pobrany z ProgrammerHumor
źródło
„Nazywam to błędem wartym miliard dolarów. To był wynalazek zerowego odniesienia w 1965 roku” - https://en.wikipedia.org/wiki/Tony_Hoare
W odniesieniu do świata rzeczywistego można założyć, że oba są takie same. To tylko składnia języka programowania, która tworzy różnicę między dwoma, jak wyjaśnili inni tutaj. To po prostu tworzy narzut, jak podczas sprawdzania / porównywania, czy zmienna łańcuchowa ma coś, musisz najpierw sprawdzić, czy nie ma wartości null, a następnie porównać rzeczywisty ciąg, tj. Dwa porównania. To strata mocy obliczeniowej dla każdego porównania strun.
Objects.equals () sprawdza wartość null przed wywołaniem .equals ().
źródło
jako ciekawostka
źródło