回答:
""は実際の文字列ですが、空の文字列です。
ただし、nullは、String変数が何も指していないことを意味します。
a==b
「」とnullはメモリ内の同じスペースを占有しないため、falseを返します。つまり、それらの変数は同じオブジェクトを指していません。
a.equals(b)
「」は明らかにnullと等しくないため、falseを返します。
ただし、 ""は実際の文字列であるため、次のようにメソッドや関数を呼び出すことができます。
a.length()
a.substring(0, 1)
等々。
bのようにStringがnullの場合、NullPointerException
呼び出しを試みたときにJavaはaをスローします。
b.length()
あなたが不思議に思っている違いが==対等しいなら、それはこれです:
==参照を比較します。
String a = new String("");
String b = new String("");
System.out.println(a==b);
2つの異なるオブジェクトを割り当て、aとbが異なるオブジェクトをポイントしているため、これはfalseを出力します。
ただし、a.equals(b)
この場合はtrueを返します。これequals
は、引数Stringがnullではなく、同じ文字シーケンスを表す場合に限り、Stringは trueを返すためです。
ただし、Javaには文字列の特殊なケースがあることに注意してください。
String a = "abc";
String b = "abc";
System.out.println(a==b);
false
2つの異なる文字列を割り当てる必要があるため、出力はになると思います。実際、Javaはリテラル文字列(この例ではaとbのように初期化される文字列)をインターンします。==がどのように機能するかについていくつかの誤検知を引き起こす可能性があるので、注意してください。
intern
有効期限が切れています。あなたはそれについて読むために別のサイトに参照することができます。weblogs.java.net/blog/enicholas/archive/2006/06/...
String a = null
を追加したa+= "example"
場合、それを印刷すると、nullexample
nullが文字列でない場合に表示されるのはなぜですか?
"num: " + 20
あなたに文字列を与えます"num: 20"
。これ20
は文字列であることを意味しますか?(そうで20
はありません、数字です)。同じ場合null
:文字列ではありませんが、追加しようとすると文字列に変換されます。
文字列はオブジェクトであり、nullにすることができます
nullは、文字列オブジェクトがインスタンス化されなかったことを意味します
「」は「aaa」のようなインスタンス化されたオブジェクト文字列の実際の値です
そのポイントを明確にするリンクは次のとおりです。http://download.oracle.com/javase/tutorial/java/concepts/object.html
if (mp==null){do something}
。
この2つにはかなりの違いがあります。空の文字列""
は、「文字が含まれていない文字列」です。明確に定義された長さを持つ実際の文字列です。すべての標準文字列操作は空の文字列で明確に定義されています。小文字に変換したり、その中の一部の文字のインデックスを検索したりできます。null文字列null
は「文字列なし」です。文字列ではないため、長さはありません。標準の文字列操作をnull文字列に適用しようとすると、NullPointerException
実行時にが発生します。
ここa is an Object
でb(null)
はオブジェクトではありませんが、null参照です
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
これが私の同じ答えです
a
とb
はどちらも参照です。 a
インスタンス化されたオブジェクトの参照です。 b
インスタンス化されたオブジェクトのない参照です(したがって、「null参照」という用語です)。
Javaでは、割り当てられた参照型にnull
はまったく値がありません。割り当てられた文字列に""
は値があります。空の文字列、つまり文字が含まれていない文字列です。変数が割り当てられるnull
と、それは、あらゆる種類、文字列などの基礎となるオブジェクトがないことを意味します。
""とnullはどちらも異なります。最初のものは、文字列変数宣言の一部として、文字列定数が文字列プールに作成され、同じメモリが割り当てられていることを意味します。
しかし、それをnullで宣言しているときは、jvmがインスタンス化されただけですが、メモリが割り当てられていません。したがって、"" -空の変数でチェックしてこのオブジェクトにアクセスしようとしても、nullpointerexceptionを防ぐことはできません。以下の1つの使用例をご覧ください。
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());
}
}
}
空の文字列はnull参照とは異なります。オブジェクト指向プログラミング言語では、文字列型へのnull参照は文字列オブジェクトを指さないため、文字列オブジェクトに対して何らかの操作を実行しようとするとエラーが発生します。空の文字列は、文字列操作が試行される可能性がある文字列です。
空の文字列に関するウィキペディアの記事から。
String s=null;
文字列はnull用に初期化されていません。文字列操作を試みた場合、nullポインタ例外をスローする可能性があります
String t="null";
これは、t = "xyz"と同じように値文字列 "null"を持つ文字列リテラルです。nullポインタはスローされません。
String u="";
空の文字列として、nullポインタはスローされません。
この概念は数学からよりよく理解することができます。計算機を使用して、数値(ゼロではない)を0で除算してみたことがありますか?7/0 :あなたは、この何かのように見えるという結果を得るでしょうundefined
、not a number
、null
などの操作は、いくつかの理由のために、不可能であることを、この手段は(聞かせての別の日に議論されるそれらの理由を残します)。
今、これを実行します:0/7。出力0を取得します。これは、操作が可能であり実行できることを意味しますが、除算後に何も残っていないため、答えは0になります。有効な出力があり、その出力はゼロです。
最初の例では、出力が無効であっただけでなく、操作を実行できませんでした。これはnull
、Javaの文字列に似ています。2番目の例はempty
文字列に似ています。
あなたが書くとき
String a = "";
これは、値「」を持つ文字列プール内のオブジェクト参照を指す文字列型の変数「a」があることを意味します。変数a
は有効な文字列オブジェクト参照を保持しているため、ここでは文字列のすべてのメソッドを適用できます。
あなたが書くとき
String b = null;
これはb
、不明な参照を指す文字列型の変数があることを意味します。また、不明な参照に対する操作はすべてになりますNullPointerException
。
さて、以下の式を評価してみましょう。
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
この画像は、違いを理解するのに役立ちます。
画像はProgrammerHumorから収集されました
「私はこれを10億ドルの間違いと呼んでいます。これは1965年のnull参照の発明でした」-https://en.wikipedia.org/wiki/Tony_Hoare
現実の世界に関しては、両方とも同じと見なすことができます。ここで説明されているように、2つの違いを生み出すプログラミング言語の単なる構文です。これは単に、文字列変数に何かがあるかどうかをチェック/比較するときのようにオーバーヘッドを作成します。最初にそれがnullでないかどうかをチェックし、次に実際の文字列を比較して2つの比較を行う必要があります。これは、すべての文字列比較の処理能力の浪費です。
Objects.equals()は、.equals()を呼び出す前にnullをチェックします。
b.equals(a)
は使用しない==
でください。null
(空の文字列と異なる値が""
、有効なStringインスタンス)ができる決してそれに呼び出されたメソッドを持っていません。「既知のnull以外」(通常は定数値またはリテラル)を等式の左側に配置することは、「ヨーダ条件式」などです。