null
と""
(空の文字列)の違いは何ですか?
私はいくつかの簡単なコードを書きました:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
どちらのステートメントも を返しfalse
ます。それらの実際の違いを見つけることができないようです。
null
と""
(空の文字列)の違いは何ですか?
私はいくつかの簡単なコードを書きました:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
どちらのステートメントも を返しfalse
ます。それらの実際の違いを見つけることができないようです。
"" は、空の文字列ですが、実際の文字列です。
ただし、null は、String 変数が何も指していないことを意味します。
a==b
"" と null はメモリ内の同じスペースを占有しないため、false を返します。つまり、それらの変数は同じオブジェクトを指していません。
a.equals(b)
"" は明らかに null と等しくないため、false を返します。
違いは、 "" は実際の文字列であるため、次のようにメソッドまたは関数を呼び出すことができることです
a.length()
a.substring(0, 1)
等々。
文字列が b のように null に等しい場合、次のようにNullPointerException
呼び出すと、Java は a をスローします。
b.length()
あなたが疑問に思っている違いが == と equals である場合、それは次のとおりです。
== 行った場合のように、参照を比較します
String a = new String("");
String b = new String("");
System.out.println(a==b);
2 つの異なるオブジェクトを割り当て、a と b が異なるオブジェクトを指しているため、これは false を出力します。
ただし、a.equals(b)
この場合は true を返します。これは、引数 String が null ではなく、同じ文字シーケンスを表す場合に限り、equals
for Strings が true を返すためです。
ただし、Java には文字列の特殊なケースがあることに注意してください。
String a = "abc";
String b = "abc";
System.out.println(a==b);
false
2 つの異なる文字列を割り当てる必要があるため、出力は になると思われます。実際、Java はリテラル文字列 (この例では a と b のように初期化されるもの)をインターンします。== がどのように機能するかについていくつかの誤検知を与える可能性があるため、注意してください。
文字列はオブジェクトであり、null にすることができます
null は、文字列オブジェクトがインスタンス化されていないことを意味します
"" は、"aaa" のようなインスタンス化されたオブジェクト文字列の実際の値です。
その点を明確にするリンクがあります http://download.oracle.com/javase/tutorial/java/concepts/object.html
あなたのステートメントがあなたに伝えていることは、 "" が null と同じではないということです - これは本当です。"" は空の文字列です。null は、値が割り当てられていないことを意味します。
試してみるとより啓発的かもしれません:
System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object
"" は引き続き文字列です。つまり、そのメソッドを呼び出して意味のある情報を取得できます。null は空の変数です - そこには文字通り何もありません。
両者にはかなり大きな違いがあります。空の文字列""
は「文字が含まれていない文字列」です。これは、長さが明確に定義された実際の文字列です。空の文字列に対する標準的な文字列操作はすべて明確に定義されています。小文字に変換したり、その中の文字のインデックスを検索したりできます。空文字列null
は「まったく文字列ではありません」。文字列ではないため、長さはありません。標準の文字列操作をヌル文字列に適用しようとすると、NullPointerException
実行時にエラーが発生します。
ここにa is an Object
あるが、オブジェクトでb(null)
はなく、null 参照です
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
ここに私の同様の答えがあります
nullは、名前がインスタンス化されたオブジェクトを参照していないことを意味します。 ""は空の文字列を意味します。
ここでaは、たまたま空の文字列であるオブジェクトを参照しています。bは null であるため、オブジェクトを参照していません。
Java では、割り当てられた参照型にnull
はまったく値がありません。割り当てられた文字列に""
は値があります: 空の文字列、つまり文字が含まれていない文字列です。変数が割り当てられている場合、null
それは、文字列またはその他の種類の基になるオブジェクトがないことを意味します。
String s = "";
s.length();
String s = null;
s.length();
空の文字列への参照""
は、ヒープ内のオブジェクトを指すため、そのオブジェクトでメソッドを呼び出すことができます。
しかし、を指している参照にnull
は、ヒープ内で指し示すオブジェクトがないため、NullPointerException
.
空文字列は null 参照とは異なります。オブジェクト指向プログラミング言語では、文字列型への null 参照は文字列オブジェクトを指しておらず、操作を実行しようとするとエラーが発生します。空の文字列は、文字列操作を試行できる文字列のままです。
空文字列に関するウィキペディアの記事から。
文字列は空にすることも、null
値を持つこともできます。文字列が の場合、null
メモリ内の何も参照していません。試してみてくださいs.length()>0
。これは、文字列が空の場合でも、長さ 0 を返すためです。したがって、何も入力しない場合でも、文字列が として登録されないため、ループが続行されnull
ます。一方、長さを確認すると、ループから抜け出します。
「私はそれを私の 10 億ドルの間違いと呼んでいます。それは 1965 年の null 参照の発明でした」 - https://en.wikipedia.org/wiki/Tony_Hoare
現実の世界に関しては、どちらも同じと見なすことができます。ここで他の人が説明したように、2つの違いを生み出すプログラミング言語の構文にすぎません。これは、文字列変数に何かがあるかどうかをチェック/比較するときのように、単純にオーバーヘッドを作成します。最初に null でないかどうかをチェックし、次に実際の文字列を比較する、つまり 2 つの比較を行う必要があります。これは、文字列比較ごとに処理能力を浪費します。
Objects.equals() は、.equals() を呼び出す前に null をチェックします。