nullと空( "")のJava文字列の違い


151

違いは何であるnull""(空の文字列)は?

私はいくつかの簡単なコードを書きました:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

どちらのステートメントも戻りfalseます。どうやら実際の違いは分からないようです。


6
と比較しますが、他の方法では「機能しない」ため、文字列比較にb.equals(a)は使用しない==でください。null(空の文字列と異なる値が""、有効なStringインスタンス)ができる決してそれに呼び出されたメソッドを持っていません。「既知のnull以外」(通常は定数値またはリテラル)を等式の左側に配置することは、「ヨーダ条件式」などです。

回答:


220

""は実際の文字列ですが、空の文字列です。

ただし、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);

false2つの異なる文字列を割り当てる必要があるため、出力はになると思います。実際、Javaはリテラル文字列(この例ではaとbのように初期化される文字列)をインターンします。==がどのように機能するかについていくつかの誤検知を引き起こす可能性があるので、注意してください。


これはC#にも適用されますか?「」の配列は{'\ 0'}であるので、null
Cole Johnson

3
に関するリンクのintern有効期限が切れています。あなたはそれについて読むために別のサイトに参照することができます。weblogs.java.net/blog/enicholas/archive/2006/06/...
アルストン

それで、私がnull文字列を持っていて、それにのような文字列String a = null追加したa+= "example"場合、それを印刷すると、nullexamplenullが文字列でない場合に表示されるのはなぜですか?
cpinamtz

@PinaGamer JavaScriptでは、文字列に非文字列を追加できます。"num: " + 20あなたに文字列を与えます"num: 20"。これ20は文字列であることを意味しますか?(そうで20はありません、数字です)。同じ場合null:文字列ではありませんが、追加しようとすると文字列に変換されます。
daboross 2018年

@Zach L:文字列s = null + "a"の場合; 出力nullaを提供しますが、null.concat( "a")はnullポインター例外を提供します。最初のケースでの理由は何ですかnull + "a"; 取り組んでいます。
Ved Prakash

249

次のようにして、nullと空の文字列の違いを理解することもできます。

nullと0 /空の文字列の違い

R. Sato(@raysato)による元の画像


7
これは素晴らしい!私は誰かにヌルか空かを説明していて、あなたの答えに出くわしました。コンセプトは彼らのためにすぐにクリックされました。
matt.fc 2018年

14

文字列はオブジェクトであり、nullにすることができます

nullは、文字列オブジェクトがインスタンス化されなかったことを意味します

「」は「aaa」のようなインスタンス化されたオブジェクト文字列の実際の値です

そのポイントを明確にするリンクは次のとおりです。http://download.oracle.com/javase/tutorial/java/concepts/object.html


「nullは、文字列オブジェクトがインスタンス化されなかったことを意味します」-ありがとうございます。それは物事をよく理解するのに役立ちます。MediaPlayerオブジェクトでifステートメントを1回使用でき、nullを使用して、それが実行されているかどうか(実行されている場合は実行するメソッドを使用して)を確認するように機能しましたが、なぜ機能したのか理解できませんでしたが、今は私はそれが何を言っているかを見ます、私はnullを使ってMediaPlayerがインスタンス化されているかどうかをチェックしていました...例えばif (mp==null){do something}
Azurespot 2014年

12

あなたのステートメントがあなたに言っていることは、 ""がnullと同じではないということです-これは真実です。""は空の文字列です。nullは、値が割り当てられていないことを意味します。

次のことを試してみると、より賢明になるでしょう。

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

""は文字列であり、そのメソッドを呼び出して意味のある情報を取得できます。nullは空の変数です-文字通り何もありません。


9

この2つにはかなりの違いがあります。空の文字列""は、「文字が含まれていない文字列」です。明確に定義された長さを持つ実際の文字列です。すべての標準文字列操作は空の文字列で明確に定義されています。小文字に変換したり、その中の一部の文字のインデックスを検索したりできます。null文字列nullは「文字列なし」です。文字列ではないため、長さはありません。標準の文字列操作をnull文字列に適用しようとすると、NullPointerException実行時にが発生します。


9

ここa is an Objectb(null)はオブジェクトではありませんが、null参照です

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

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

これが私の同じ答えです


1
abはどちらも参照です。 aインスタンス化されたオブジェクトの参照です。 bインスタンス化されたオブジェクトのない参照です(したがって、「null参照」という用語です)。
私の正しい意見だけで

私は-1に対抗しました;-)しかし、この答えを明確にし、「オブジェクト」とnull値の違いとオブジェクトと変数の違いを議論することは役に立ちます。

@pst感謝:)ここでは、この質問に似て私のもう一つの答えですので、私は心でそれに答えstackoverflow.com/questions/4459623/...

8

nullは、名前がインスタンス化されたオブジェクトを参照していないことを意味します。 「」は空の文字列を意味します。

ここは、空の文字列であるオブジェクトを参照しています。bはnullであるため、オブジェクトを参照していません。


5

Javaでは、割り当てられた参照型にnullまったく値がありません。割り当てられた文字列に""は値があります。空の文字列、つまり文字が含まれていない文字列です。変数が割り当てられるnullと、それは、あらゆる種類、文字列などの基礎となるオブジェクトがないことを意味します。


4

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

}


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

String s = null;
s.length();

空の文字列への参照""は、ヒープ内のオブジェクトを指します-そのため、その上でメソッドを呼び出すことができます。

ただし、参照を指す参照nullにはヒープ内を指すオブジェクトがないため、を取得しNullPointerExceptionます。


1

空の文字列はnull参照とは異なります。オブジェクト指向プログラミング言語では、文字列型へのnull参照は文字列オブジェクトを指さないため、文字列オブジェクトに対して何らかの操作を実行しようとするとエラーが発生します。空の文字列は、文字列操作が試行される可能性がある文字列です。

空の文字列に関するウィキペディアの記事から。


1

String s=null;

文字列はnull用に初期化されていません。文字列操作を試みた場合、nullポインタ例外をスローする可能性があります

String t="null";

これは、t = "xyz"と同じように値文字列 "null"を持つ文字列リテラルです。nullポインタはスローされません。

String u="";

空の文字列として、nullポインタはスローされません。


0

文字列は空またはnull値を持つことができます。文字列がの場合null、それはメモリ内の何も参照していません。お試しくださいs.length()>0。これは、文字列が空の場合でも長さ0を返すためです。そのため、何も入力しないと、文字列がとして登録されないため、ループが続行されnullます。一方、長さをチェックすると、ループから抜けます。


0

この概念は数学からよりよく理解することができます。計算機を使用して、数値(ゼロではない)を0で除算してみたことがありますか?7/0 :あなたは、この何かのように見えるという結果を得るでしょうundefinednot a numbernullなどの操作は、いくつかの理由のために、不可能であることを、この手段は(聞かせての別の日に議論されるそれらの理由を残します)。

今、これを実行します:0/7。出力0を取得します。これは、操作が可能であり実行できることを意味しますが、除算後に何も残っていないため、答えは0になります。有効な出力があり、その出力はゼロです。

最初の例では、出力が無効であっただけでなく、操作を実行できませんでした。これはnull、Javaの文字列に似ています。2番目の例はempty文字列に似ています。


0

あなたが書くとき

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

0

簡単に言えば、

  • 「」は空の文字列です

  • nullは空の文字列変数です。


0

nullと空の文字列の違い。たとえば、xという名前の変数があるとします。JSで書くと、

var x = "";

これは、空の文字列(長さが0)の値を割り当てたことを意味します。実際これは何かのようなものですが、それは何も感じません:)一方、

var y = null;

これは、宣言時にyにnullを書き込んで明確に言った値をyに割り当てていないことを意味します。y.lengthと書くと yに値が割り当てられておらず、その結果yの長さを読み取れないことを示すエラーがスローされます。


質問はJavaです
ベガ


0

「私はこれを10億ドルの間違いと呼んでいます。これは1965年のnull参照の発明でした」-https://en.wikipedia.org/wiki/Tony_Hoare

現実の世界に関しては、両方とも同じと見なすことができます。ここで説明されているように、2つの違いを生み出すプログラミング言語の単なる構文です。これは単に、文字列変数に何かがあるかどうかをチェック/比較するときのようにオーバーヘッドを作成します。最初にそれがnullでないかどうかをチェックし、次に実際の文字列を比較して2つの比較を行う必要があります。これは、すべての文字列比較の処理能力の浪費です。

Objects.equals()は、.equals()を呼び出す前にnullをチェックします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.