Was ist der Unterschied zwischen null
und der ""
(leeren Zeichenfolge)?
Ich habe einen einfachen Code geschrieben:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
Beide Aussagen kehren zurück false
. Es scheint, ich bin nicht in der Lage, den tatsächlichen Unterschied zwischen ihnen zu finden.
b.equals(a)
- aber nicht==
zum Vergleichen von Zeichenfolgen verwenden, da "es nicht funktioniert" auf andere Weise. Für dennull
Wert (der sich von einer leeren Zeichenfolge""
, einer gültigen Zeichenfolgeninstanz , unterscheidet ) kann niemals eine Methode aufgerufen werden. Das Platzieren des "bekannten Nicht-Null" (normalerweise ein konstanter Wert oder ein Literal) auf der linken Seite der Gleichheit ist "Yoda-Bedingungen" oder ähnliches.Antworten:
"" ist eine tatsächliche Zeichenfolge, wenn auch eine leere.
null bedeutet jedoch, dass die Variable String auf nichts zeigt.
a==b
gibt false zurück, weil "" und null nicht denselben Speicherplatz belegen - mit anderen Worten, ihre Variablen zeigen nicht auf dieselben Objekte.a.equals(b)
gibt false zurück, weil "" offensichtlich nicht gleich null ist.Der Unterschied besteht jedoch darin, dass Sie, da "" eine tatsächliche Zeichenfolge ist, weiterhin Methoden oder Funktionen wie diese aufrufen können
a.length()
a.substring(0, 1)
und so weiter.
Wenn der String gleich Null ist, wie b, würde Java a auslösen,
NullPointerException
wenn Sie versuchen, aufzurufen, sagen Sie:b.length()
Wenn der Unterschied, über den Sie sich wundern, == gegen gleich ist, ist dies:
== vergleicht Referenzen, als ob ich gegangen wäre
Das würde false ausgeben, da ich zwei verschiedene Objekte zugewiesen habe und a und b auf verschiedene Objekte zeigen.
In
a.equals(b)
diesem Fall würde jedoch true zurückgegeben, daequals
for Strings nur dann true zurückgibt, wenn das Argument String nicht null ist und dieselbe Zeichenfolge darstellt.Seien Sie jedoch gewarnt, dass Java einen Sonderfall für Strings hat.
Sie würden denken, dass die Ausgabe wäre
false
, da sie zwei verschiedene Strings zuordnen sollte. Tatsächlich wird Java wörtliche Strings internieren (solche, die in unserem Beispiel wie a und b initialisiert sind). Seien Sie also vorsichtig, denn dies kann zu Fehlalarmen bei der Funktionsweise von == führen.quelle
intern
ist abgelaufen. Sie können auf eine andere Website verweisen, um mehr darüber zu erfahrenString a = null
und ihn dann wie beim Drucken an einen String anhängea+= "example"
, warum wird angezeigt,nullexample
wenn Null kein String ist?"num: " + 20
gibt Ihnen die Zeichenfolge"num: 20"
. Bedeutet das, dass20
es sich um eine Zeichenfolge handelt? (Es ist nicht,20
ist eine Zahl). Gleicher Fall fürnull
: Es handelt sich nicht um eine Zeichenfolge, sie kann jedoch in eine Zeichenfolge konvertiert werden, wenn Sie versuchen, sie hinzuzufügen.Sie können den Unterschied zwischen null und einer leeren Zeichenfolge auch folgendermaßen verstehen:
Originalbild von R. Sato ( @raysato )
quelle
String ist ein Objekt und kann null sein
null bedeutet, dass das String-Objekt nicht instanziiert wurde
"" ist ein tatsächlicher Wert der instanziierten Objektzeichenfolge wie "aaa"
Hier ist ein Link, der diesen Punkt verdeutlichen könnte: http://download.oracle.com/javase/tutorial/java/concepts/object.html
quelle
if (mp==null){do something}
.Was Ihre Aussagen Ihnen sagen, ist nur, dass "" nicht dasselbe ist wie null - was wahr ist. "" ist eine leere Zeichenfolge; null bedeutet, dass kein Wert zugewiesen wurde.
Es könnte aufschlussreicher sein, zu versuchen:
"" ist immer noch eine Zeichenfolge, dh Sie können ihre Methoden aufrufen und aussagekräftige Informationen erhalten. null ist eine leere Variable - da ist buchstäblich nichts.
quelle
Es gibt einen ziemlich signifikanten Unterschied zwischen den beiden. Die leere Zeichenfolge
""
ist "die Zeichenfolge, die keine Zeichen enthält". Es ist eine tatsächliche Zeichenfolge mit einer genau definierten Länge. Alle Standard-Zeichenfolgenoperationen sind für die leere Zeichenfolge genau definiert. Sie können sie in Kleinbuchstaben konvertieren, den Index eines Zeichens darin nachschlagen usw. Die Nullzeichenfolgenull
lautet "überhaupt keine Zeichenfolge". Es hat keine Länge, weil es überhaupt keine Zeichenfolge ist. Der Versuch, eine Standardzeichenfolgenoperation auf die Nullzeichenfolge anzuwenden, führtNullPointerException
zur Laufzeit zu einer.quelle
hierher
a is an Object
aberb(null)
ist nicht ein Objekt ist ein NULL - VerweisHier ist meine ähnliche Antwort
quelle
a
undb
sind Referenzen.a
ist eine Referenz mit einem instanziierten Objekt.b
ist eine Referenz ohne instanziiertes Objekt (daher der Begriff "Nullreferenz").null
Wert und den Unterschied zwischen Objekten und Variablen zu diskutieren .null bedeutet, dass der Name kein instanziiertes Objekt referenziert. "" bedeutet eine leere Zeichenfolge.
Hier ein verweist einiges Objekt , das eine leere Zeichenfolge sein geschieht. b verweist nicht auf ein Objekt, da es null ist.
quelle
In Java hat ein zugewiesener Referenztyp
null
überhaupt keinen Wert . Eine zugewiesene Zeichenfolge""
hat einen Wert: eine leere Zeichenfolge, dh eine Zeichenfolge ohne Zeichen. Wenn eine Variable zugewiesen wirdnull
, bedeutet dies, dass kein zugrunde liegendes Objekt jeglicher Art, Zeichenfolge oder auf andere Weise vorhanden ist.quelle
"" und null sind beide unterschiedlich. Die erste bedeutet, dass im Rahmen der Deklaration von Zeichenfolgenvariablen die Zeichenfolgenkonstante im Zeichenfolgenpool erstellt und ein Speicher für dieselbe zugewiesen wurde.
Aber wenn wir es mit null deklarieren, wurde es gerade jvm instanziiert, aber es wurde kein Speicher dafür zugewiesen. Wenn Sie versuchen, auf dieses Objekt zuzugreifen, indem Sie es mit der leeren Variablen "" - überprüfen , kann dies keine Nullpointerexception verhindern. Nachfolgend finden Sie einen Anwendungsfall.
}}
quelle
Ein Verweis auf eine leere Zeichenfolge
""
verweist auf ein Objekt im Heap, sodass Sie Methoden dafür aufrufen können.Eine Referenz, auf die verweist,
null
hat jedoch kein Objekt, auf das im Heap verwiesen werden kann, und daher erhalten Sie eineNullPointerException
.quelle
Aus dem Wikipedia-Artikel über leere Zeichenfolge .
quelle
String s=null;
String wird nicht für null initialisiert. Wenn eine Zeichenfolgenoperation versucht wird, kann eine Nullzeigerausnahme ausgelöst werden
String t="null";
Es ist ein String-Literal mit dem Wert string "null" wie t = "xyz". Es wird kein Nullzeiger geworfen.
String u="";
Es ist eine leere Zeichenfolge. Es wird kein Nullzeiger ausgegeben.
quelle
Eine Zeichenfolge kann leer sein oder einen
null
Wert haben. Wenn es sich um eine Zeichenfolge handeltnull
, bezieht sie sich nicht auf etwas im Speicher. Versuchen Sie ess.length()>0
. Dies liegt daran, dass eine leere Zeichenfolge immer noch eine Länge von 0 zurückgibt. Wenn Sie also nichts für dieselbe Zeichenfolge eingeben, wird die Schleife fortgesetzt, da die Zeichenfolge nicht als registriert wirdnull
. Wenn Sie dagegen nach der Länge suchen, wird die Schleife verlassen.quelle
Dieses Konzept kann aus der Mathematik besser verstanden werden. Haben Sie jemals versucht, eine Zahl (nicht Null) mit einem Taschenrechner, z. B. 7/0, durch 0 zu teilen? Sie erhalten ein Ergebnis erhalten , das aussieht wie etwas , das:
undefined
,not a number
,null
usw. Dies bedeutet , dass die Operation nicht möglich ist, aus irgendwelchen Gründen (lassen Sie sich diese Gründe lassen an einem anderen Tag diskutiert werden).Führen Sie nun Folgendes aus: 0/7. Sie erhalten die Ausgabe 0. Dies bedeutet, dass die Operation möglich ist und ausgeführt werden kann, aber Sie haben nur die Antwort 0, da nach der Division nichts mehr übrig ist. Es gibt eine gültige Ausgabe und diese Ausgabe ist Null.
Im ersten Beispiel war nicht nur die Ausgabe ungültig, die Operation konnte auch nicht ausgeführt werden. Dies ist vergleichbar mit einem
null
String in Java. Das zweite Beispiel ähnelt einemempty
String.quelle
Wenn du schreibst
String a = "";
Dies bedeutet, dass es eine Variable 'a' vom Typ string gibt, die auf eine Objektreferenz im Zeichenfolgenpool verweist, die den Wert "" hat. Da die Variable
a
eine gültige Zeichenfolgenobjektreferenz enthält, können hier alle Zeichenfolgenmethoden angewendet werden.Während beim Schreiben
String b = null;
Dies bedeutet, dass es eine Variable
b
vom Typ string gibt, die auf eine unbekannte Referenz verweist . Und jede Operation mit unbekannter Referenz führt zu einemNullPointerException
.Lassen Sie uns nun die folgenden Ausdrücke bewerten.
quelle
In einfachen Worten,
"" ist eine leere Zeichenfolge
null ist eine leere Stringvariable .
quelle
Unterschied zwischen null und leerer Zeichenfolge. Zum Beispiel: Sie haben eine Variable namens x. Wenn Sie in JS schreiben,
var x = "";
Dies bedeutet, dass Sie einen Wert zugewiesen haben, der eine leere Zeichenfolge ist (Länge ist 0). Eigentlich ist das wie etwas, aber das ist ein Gefühl von nichts :) Auf der anderen Seite,
var y = null;
Dies bedeutet, dass Sie y keinen Wert zugewiesen haben, der eindeutig angegeben ist, indem Sie zum Zeitpunkt der Deklaration null an y geschrieben haben. Wenn Sie y.length schreiben; Es wird ein Fehler ausgegeben, der angibt, dass y kein Wert zugewiesen wurde und daher die Länge von y nicht gelesen werden kann.
quelle
Dieses Bild kann Ihnen helfen, die Unterschiede zu verstehen.
Das Bild wurde von ProgrammerHumor gesammelt
quelle
"Ich nenne es meinen Milliarden-Dollar-Fehler. Es war die Erfindung der Nullreferenz im Jahr 1965" - https://en.wikipedia.org/wiki/Tony_Hoare
In Bezug auf die reale Welt können beide gleich angenommen werden. Es ist nur eine Syntax einer Programmiersprache, die einen Unterschied zwischen zwei erzeugt, wie von anderen hier erklärt. Dies erzeugt einfach Overhead, wie beim Überprüfen / Vergleichen, ob eine Zeichenfolgenvariable etwas enthält. Sie müssen zuerst prüfen, ob sie nicht null ist, und dann den tatsächlichen Zeichenfolgenvergleich, dh zwei Vergleiche. Dies ist eine Verschwendung von Rechenleistung für jeden Zeichenfolgenvergleich.
Objects.equals () sucht vor dem Aufruf von .equals () nach null.
quelle
als eine neugier
quelle