Różnica między pustym i pustym („”) ciągiem Java


151

Jaka jest różnica między nulla ""(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.


6
Porównaj z b.equals(a)- ale nie używaj ==do porównywania ciągów, ponieważ „to nie zadziała” w inny sposób. nullWartość (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:


220

„” 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, NullPointerExceptionjeś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ż equalsfor 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 ==.


Czy dotyczy to również języka C #? Tak jak w tablicy „” to {'\ 0'}, a null
Cole Johnson

3
Link o internwygasł. Aby przeczytać o tym, możesz odwołać się do innej witryny: weblogs.java.net/blog/enicholas/archive/2006/06/…
Alston

Tak więc, jeśli mam pusty ciąg, String a = nulla następnie dołączam do niego ciąg, na przykład a+= "example", kiedy go drukuję, dlaczego wyświetla się, nullexamplejeśli null nie jest ciągiem?
cpinamtz

@PinaGamer JavaScript pozwala na dodawanie znaków niebędących ciągami do łańcuchów. "num: " + 20daje ci ciąg "num: 20". Czy to oznacza, że 20jest to ciąg? (to nie 20jest , to liczba). To samo dotyczy null: nie jest to ciąg, ale można go przekonwertować na jeden, jeśli spróbujesz go dodać.
daboross

@Zach L: when String s = null + "a"; daje wynikowi wartość nulla, ale null.concat ("a") daje wyjątek wskaźnika zerowego. jaki jest powód w moim pierwszym przypadku null + "a"; działa.
Ved Prakash,

249

Możesz również zrozumieć różnicę między null a pustym ciągiem w ten sposób:

Różnica między null i 0 / pusty ciąg

Oryginalny obraz R. Sato ( @raysato )


7
To jest świetne! Tłumaczyłem komuś zero vs pusty i natknąłem się na twoją odpowiedź. Ta koncepcja natychmiast się spodobała.
matt.fc

14

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


„null oznacza, że ​​obiekt String nie został utworzony” - dziękujemy! to pomaga mi dużo zrozumieć. Byłem w stanie raz użyć instrukcji if w obiekcie MediaPlayer i działało, używając wartości null, aby sprawdzić, czy działa, czy nie (z metodą do wykonania, jeśli była), ale nigdy nie rozumiałem, dlaczego to działa, ale teraz Widzę, co mówi, sprawdzałem, czy wystąpienie MediaPlayer zostało uruchomione, czy nie, używając null ... np if (mp==null){do something}.
Azurespot

12

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:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

„” 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.


9

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 pusty nullto „ż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ąpienie NullPointerExceptionatrybutu at.


9

Tutaj a is an Objectjednak b(null)jest nie Object jest punktem odniesienia wartości null

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

oto moja podobna odpowiedź


1
Obie ai bsą referencjami. ajest odwołaniem do instancji obiektu. bjest odwołaniem bez utworzonego obiektu (stąd termin „odwołanie zerowe”).
TYLKO MOJA poprawna OPINIA

Zrezygnowałem z -1 ;-) Ale pomogłoby to wyjaśnić tę odpowiedź i przedyskutować różnicę między „obiektem” a nullwartością oraz różnicą między obiektami i zmiennymi.

@pst thanks :) Odpowiedziałem na to na pamięć, bo oto moja kolejna odpowiedź, która jest podobna do tego pytania stackoverflow.com/questions/4459623/…

8

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.


5

W Javie przypisany typ odwołania nienull ma żadnej wartości . Przypisany ciąg ""ma wartość: pusty ciąg, czyli łańcuch bez znaków. Kiedy przypisana jest zmienna null, oznacza to, że nie ma żadnego obiektu bazowego, łańcucha lub innego.


4

„” 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.

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}


4
String s = "";
s.length();

String s = null;
s.length();

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 nullnie ma obiektu do wskazania na stercie, więc otrzymasz plik NullPointerException.


1

Pusty ciąg różni się od odwołania o wartości null tym, że w języku programowania zorientowanego obiektowo odwołanie o wartości zerowej do typu łańcuchowego nie wskazuje na obiekt typu string i spowoduje błąd przy próbie wykonania na nim dowolnej operacji. Ciąg pusty jest nadal ciągiem, na którym można próbować wykonywać operacje na łańcuchach.

Z artykułu w Wikipedii o pustym łańcuchu .


1

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.


0

Ciąg może być pusty lub mieć nullwartość. Jeśli ciąg to null, to nie odnosi się do niczego w pamięci. Spróbuj s.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 jako null. Natomiast jeśli sprawdzisz długość, wyjdzie ze swojej pętli.


0

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, nullitp 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 nullstringów w Javie. Drugi przykład jest podobny do emptystringa.


0

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 aprzechowuje 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 btypu string, która wskazuje na nieznane odniesienie . Każda operacja na nieznanym odwołaniu spowoduje błąd NullPointerException.

Teraz oceńmy poniższe wyrażenia.

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed

0

Krótko mówiąc,

  • „” jest pustym ciągiem

  • null jest pustą zmienną łańcuchową .


0

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.


Pytanie dotyczy Javy
Vega


0

„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 ().


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.