Unterschied zwischen null und leer (“”) Java String

Was ist der Unterschied zwischen null und dem "" (leere 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 statementen geben false . Es scheint, ich bin nicht in der Lage zu finden, was der tatsächliche Unterschied zwischen ihnen ist.

“” ist eine tatsächliche Zeichenkette, wenn auch eine leere.

null bedeutet jedoch, dass die String-Variable auf nichts zeigt.

a==b gibt false zurück, weil “” und null nicht denselben Speicherplatz im Speicher belegen – mit anderen Worten, ihre Variablen zeigen nicht auf die gleichen Objekte.

a.equals(b) gibt false zurück, weil “” offensichtlich nicht gleich null ist.

Der Unterschied ist jedoch, dass, da “” eine tatsächliche Zeichenkette ist, Sie immer noch Methoden oder functionen darauf aufrufen können

a.length()

a.substring(0, 1)

und so weiter.

Wenn der String gleich null ist, würde Java, wie b, eine NullPointerException wenn Sie versucht haben, aufzurufen:

b.length()


Wenn der Unterschied, über den Sie sich wundern, == oder gleich ist, dann ist es das:

== vergleicht Referenzen, wie wenn ich ging

 String a = new String(""); String b = new String(""); System.out.println(a==b); 

Das würde false ausgeben, weil ich zwei verschiedene Objekte zugewiesen habe und a und b auf verschiedene Objekte zeigen.

a.equals(b) in diesem Fall jedoch true zurückgeben, da equals für Strings nur dann true a.equals(b) wenn das Argument String nicht null ist und dieselbe Zeichenfolge darstellt.

Seien Sie jedoch gewarnt, dass Java einen speziellen Fall für Strings hat.

 String a = "abc"; String b = "abc"; System.out.println(a==b); 

Sie würden denken, dass die Ausgabe false , da sie zwei verschiedene Strings zuweisen sollte. Tatsächlich wird Java literale Strings internieren (solche, die in unserem Beispiel wie a und b initialisiert werden). Sei also vorsichtig, denn das kann einige falsche Positive darüber geben, wie == funktioniert.

Sie können auch den Unterschied zwischen Null und leerer Zeichenfolge auf diese Weise verstehen:

Unterschied zwischen null und 0 / leerer String

String ist ein Objekt und kann null sein

Null bedeutet, dass das String-Objekt nicht instanziiert wurde

“” ist ein tatsächlicher Wert der instanziierten Objektkette wie “aaa”

Hier ist ein Link, der diesen Punkt http://download.oracle.com/javase/tutorial/java/concepts/object.html verdeutlichen könnte

Was deine Aussagen dir sagen, ist nur, dass “” nicht gleich Null ist – was wahr ist. “” ist eine leere Zeichenfolge; null bedeutet, dass kein Wert zugewiesen wurde.

Es könnte aufschlussreicher sein zu versuchen:

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

“” ist immer noch eine Zeichenfolge, was bedeutet, dass Sie ihre Methoden aufrufen und aussagekräftige Informationen erhalten können. null ist eine leere Variable – da ist buchstäblich nichts.

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, die eine genau definierte Länge hat. Alle Standard-String-Operationen sind in der leeren Zeichenfolge gut definiert – Sie können sie in Kleinbuchstaben umwandeln, den Index eines Zeichens darin suchen usw. Die Null-Zeichenkette null ist “keine Zeichenkette”. Es hat keine Länge, weil es überhaupt keine Zeichenfolge ist. NullPointerException versuchen, eine Standardzeichenfolgenoperation auf die Nullzeichenfolge NullPointerException zur Laufzeit eine NullPointerException .

Null bedeutet, dass der Name kein instanziiertes Objekt referenziert. “” bedeutet eine leere Zeichenfolge.

Hier verweist a auf ein Objekt, bei dem es sich um eine leere Zeichenfolge handelt. b referenziert kein Objekt, da es null ist.

Hier a is an Object aber b(null) ist kein Objekt, es ist eine Nullreferenz

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

Hier ist meine ähnliche Antwort

In Java hat ein null zugewiesener Referenztyp überhaupt keinen Wert . Eine Zeichenfolge, der "" zugewiesen ist, hat einen Wert: eine leere Zeichenfolge, also eine Zeichenfolge ohne Zeichen. Wenn eine Variable null zugewiesen wird, bedeutet dies, dass es kein zugrunde liegendes Objekt irgendeiner Art, String oder anderweitig gibt.

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

Ein Verweis auf eine leere Zeichenfolge "" verweist auf ein Objekt im Heap – Sie können Methoden darauf aufrufen.

Aber eine Referenz, die auf null zeigt, hat kein Objekt im Heap und daher erhalten Sie eine NullPointerException .

“” und null sind beide unterschiedlich. der erste bedeutet, dass im Rahmen der String-Variablendeklaration die String-Konstante im String-Pool erstellt wurde und für denselben Speicher reserviert wurde.

Aber wenn wir es mit null deklarieren, wurde es gerade jvm instanziiert, aber es wurde ihm kein Speicher zugewiesen. Wenn Sie also versuchen, auf dieses Objekt zuzugreifen, indem Sie es mit der Variablen “” – blank markieren, kann dies die Nullpunkterregung nicht verhindern. Nachfolgend finden Sie einen Anwendungsfall.

 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()); } } 

}

Die leere Zeichenfolge unterscheidet sich von einer Nullreferenz darin, dass in einer objektorientierten Programmiersprache eine Nullreferenz auf einen Zeichenfolgentyp nicht auf ein Zeichenfolgenobjekt zeigt und einen Fehler verursacht, wenn versucht wird, eine Operation auszuführen. Die leere Zeichenfolge ist immer noch eine Zeichenfolge, auf der Zeichenfolgenoperationen versucht werden können.

Aus dem Wikipedia-Artikel über leere Zeichenfolge .

Eine Zeichenfolge kann leer sein oder einen null haben. Wenn eine Zeichenfolge null ist, bezieht sie sich nicht auf etwas im Speicher. Versuchen Sie es mit s.length()>0 . Wenn eine Zeichenfolge leer ist, wird eine Länge von 0 zurückgegeben. Wenn Sie also nichts für dieselbe Zeichenfolge eingeben, wird die Schleife weiterhin fortgesetzt, da die Zeichenfolge nicht als null registriert wird. Wenn Sie jedoch die Länge überprüfen, wird die Schleife verlassen.

Dieses Konzept kann besser aus der Mathematik verstanden werden. Haben Sie jemals versucht, eine Zahl (nicht Null) durch einen Taschenrechner, zB 7/0, mit 0 zu teilen? Sie erhalten ein Ergebnis, das wie folgt aussieht: undefined , not a number , null usw. Das bedeutet, dass die Operation aus irgendwelchen Gründen unmöglich ist (lassen Sie uns diese Gründe noch einen weiteren Tag besprechen).

Nun, führe das aus: 0/7. Sie erhalten die Ausgabe, 0. Dies bedeutet, dass die Operation möglich ist und ausgeführt werden kann, aber Sie die Antwort ist nur 0, weil nichts nach der Division übrig ist. Es gibt eine gültige Ausgabe und diese Ausgabe ist Null.

Im ersten Beispiel war die Ausgabe nicht nur ungültig, die Operation konnte nicht ausgeführt werden. Dies ist vergleichbar mit null string in Java. Das zweite Beispiel ähnelt einer empty Zeichenfolge.