web-dev-qa-db-ger.com

Unterschied zwischen null und leerem ("") 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 Anweisungen geben false zurück. Es scheint, dass ich nicht in der Lage bin, den tatsächlichen Unterschied zwischen ihnen zu finden.

125
Vikas Patidar

"" ist eine tatsächliche Zeichenfolge, wenn auch eine leere.

null bedeutet jedoch, dass die Variable String auf nichts verweist.

a==b gibt false zurück, weil "" und null nicht denselben Speicherplatz belegen - mit anderen Worten, ihre Variablen verweisen nicht auf dieselben Objekte.

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

Der Unterschied besteht jedoch darin, dass Sie, da "" eine tatsächliche Zeichenfolge ist, weiterhin Methoden oder Funktionen aufrufen können, die der Zeichenfolge ähneln

a.length()

a.substring(0, 1)

und so weiter.

Wenn der String gleich null ist, wie b, würde Java ein NullPointerException auslösen, wenn Sie versuchten aufzurufen, sagen Sie:

b.length()


Wenn der Unterschied, über den Sie sich wundern, == versus gleich ist, ist es der folgende:

== vergleicht Referenzen, als wäre ich gegangen

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

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

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

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

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

Sie würden denken, dass die Ausgabe false ist, da sie zwei verschiedene Zeichenfolgen zuordnen sollte. Tatsächlich wird Java intern wörtliche Zeichenfolgen (die in unserem Beispiel wie a und b initialisiert werden). Seien Sie also vorsichtig, da dies zu Fehlalarmen bei der Funktionsweise von == führen kann.

210
Zach L

Sie können den Unterschied zwischen null und leerer Zeichenfolge auch folgendermaßen verstehen:

 Difference between null and 0/empty string

157
mikiqex

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

13
Aba Dov

Was Ihre Aussagen Ihnen 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 seine Methoden aufrufen und aussagekräftige Informationen erhalten können. null ist eine leere Variable - dort gibt es buchstäblich nichts.

12
Arkaaito

hier a is an Object aber b(null) ist nicht ein Objekt;

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

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

hier ist meine ähnliche Antwort

9
user467871

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-Vorgänge sind für den leeren String gut definiert - Sie können ihn in Kleinbuchstaben konvertieren, den Index eines Zeichens darin nachschlagen usw. Der Null-String null lautet "keine Zeichenfolge". Es hat keine Länge, weil es überhaupt keine Zeichenfolge ist. Wenn Sie versuchen, eine Standardstringoperation auf den Nullstring anzuwenden, wird zur Laufzeit eine NullPointerException ausgelöst.

9
templatetypedef

null bedeutet, dass der Name kein instanziiertes Objekt referenziert. "" bedeutet leere Zeichenfolge.

Hier verweist a auf ein Objekt, das zufällig eine leere Zeichenfolge ist. b verweist nicht auf ein Objekt, da es null ist. 

8
Shamim Hafiz

In Java hat ein Referenztyp, dem null zugewiesen ist, überhaupt keinen Wert . Eine "" zugewiesene Zeichenfolge hat einen Wert: eine leere Zeichenfolge, d. H. Eine Zeichenfolge ohne Zeichen. Wenn einer Variablen null zugewiesen wird, bedeutet dies, dass sich kein Objekt irgendeiner Art, Zeichenfolge oder sonstiges befindet.

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

String s = null;
s.length();

Ein Verweis auf eine leere Zeichenfolge "" zeigt auf ein Objekt im Heap - damit Sie Methoden darauf aufrufen können. 

Eine Referenz, die auf null zeigt, hat jedoch kein Objekt, das auf den Heap-Speicherplatz verweist, und daher wird eine NullPointerException angezeigt.

4
Mukesh Kumar

"" und null beide sind unterschiedlich. Die erste bedeutet, dass als Teil der String-Variablendeklaration die String-Konstante im String-Pool erstellt wurde und ein Teil des Speichers für denselben reserviert wurde.

Wenn wir es jedoch mit null deklarieren, wurde jvm gerade instanziiert, es wurde jedoch kein Speicher zugewiesen. Wenn Sie also versuchen, auf dieses Objekt zuzugreifen, indem Sie es mit der Variablen "" - blank überprüfen, kann die Nullpunkterexception nicht verhindert werden. 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());
    }
}

}

4
siddhartha

Die leere Zeichenfolge unterscheidet sich von einer NULL-Verweis in einem objektorientierte Programmiersprache a Nullverweis auf einen Zeichenfolgentyp verweist nicht auf ein String-Objekt und wird einen Fehler verursachen, wenn versucht wurde, Führen Sie eine beliebige Operation aus. Die leere String ist immer noch ein String, auf den Zeichenkettenoperationen können versucht werden.

Aus dem Wikipedia-Artikel zu leere Zeichenfolge .

1
weltraumpirat

Eine Zeichenfolge kann leer sein oder einen null-Wert haben. Wenn ein String null ist, bezieht er sich nicht auf irgendetwas im Speicher. Versuchen Sie es mit s.length()>0. Dies liegt daran, dass eine leere Zeichenfolge immer noch eine Länge von 0 zurückgibt. Wenn Sie also nichts eingeben, wird die Schleife fortgesetzt, da sie die Zeichenfolge nicht als null registriert. Wenn Sie nach Länge suchen, wird die Schleife verlassen. 

0
Bibiana

String s=null;

Die Zeichenfolge wird nicht für null initialisiert. Wenn eine Zeichenfolgeoperation versucht wird, kann sie eine Nullzeigerausnahme auslösen

String t="null";

Es ist ein String-Literal mit dem Wert "null" wie t = "xyz". Es wird kein Nullzeiger ausgelöst.

String u="";

Es ist eine leere Zeichenfolge. Es wird kein Nullzeiger ausgelöst.

0

Dieses Konzept kann aus der Mathematik besser verstanden werden. Haben Sie schon einmal versucht, eine Zahl (nicht Null) durch einen Taschenrechner, z. B. 7/0, durch 0 zu teilen? Sie erhalten ein Ergebnis, das wie folgt aussieht: undefined, not a number, null usw. Dies bedeutet, dass die Operation aus bestimmten Gründen unmöglich ist (lassen Sie uns diese Gründe an einem anderen Tag besprechen).

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 die Antwort ist nur 0, da nach der Division nichts ü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 nicht ausgeführt werden. Dies ist vergleichbar mit null string in Java. Das zweite Beispiel ist empty string ähnlich.

0
user8715994

Ich habe außerdem festgestellt, dass leere Zeichenfolge eine leere Zeichenfolge ist, sie enthält jedoch noch eine gültige Speicheradresse. Der NULL-Zeiger zeigt jedoch auf nichts. 

https://shirleyanengineer.blogspot.com/2019/01/does-empty-string-has-address.html

0
Shirley V

Wenn du schreibst

String a = "";

Dies bedeutet, dass es eine Variable 'a' vom Typ string gibt, die auf eine Objektreferenz im String-Pool zeigt, die den Wert "" hat. Da die Variable a einen gültigen String-Objektverweis enthält, können hier alle Methoden des Strings angewendet werden.

Während du schreibst

String b = null;

Dies bedeutet, dass es eine Variable b vom Typ string gibt, die auf eine unbekannte Referenz zeigt. Jede Operation mit unbekannter Referenz führt zu einer NullPointerException.

Lassen Sie uns nun die folgenden Ausdrücke bewerten.

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
Neeraj Singh

In einfachen Worten,

  • "" ist ein leerer String

  • null ist ein leeres String-Variable.

0
RoboAlex