web-dev-qa-db-ja.com

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

null""(空の文字列)の違いは何ですか?

簡単なコードを書きました。

String a = "";
String b = null;

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

どちらのステートメントもfalseを返します。私はそれらの間の実際の違いが何かを見つけることができないようです。

130
Vikas Patidar

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

nullは、String変数が何も指していないことを意味します。

""とnullはメモリ内の同じ領域を占有しないため、a==bはfalseを返します。言い換えると、それらの変数は同じオブジェクトを指していません。

""はnullと等しくないため、a.equals(b)はfalseを返します。

違いは、 ""は実際の文字列なので、それでもメソッドや関数を呼び出すことができるという点です。

a.length()

a.substring(0, 1)

等々。

BのようにStringがnullの場合、Javaを起動しようとするとNullPointerExceptionがスローされます。

b.length()


あなたが疑問に思っている違いが==対等しいならば、それはこれです:

==私が行ったように、参照を比較します

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

2つの異なるオブジェクトを割り当て、aとbが異なるオブジェクトを指すため、これはfalseを出力します。

ただし、この場合のa.equals(b)はtrueを返します。なぜなら、Stringのequalsは、引数Stringがnullではなく、同じ文字シーケンスを表す場合に限り、true を返すからです。

ただし、JavaにはStringに対する特別なケースがあることに注意してください。

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

2つの異なる文字列を割り当てる必要があるため、出力はfalseになると思います。実際には、Javaは リテラル リテラル文字列(この例ではaとbのように初期化されたもの)になります。そのため、==がどのように機能するかについて誤った判断を下す可能性があるので注意してください。

200
Zach L

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

Difference between null and 0/empty string

186
mikiqex

文字列はオブジェクトであり、nullでもかまいません

nullは、Stringオブジェクトがインスタンス化されていないことを意味します

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

その点を明確にするためのリンクを次に示します http://download.Oracle.com/javase/tutorial/Java/concepts/object.html

13
Aba Dov

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

試してみるほうが賢明かもしれません。

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

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

12
Arkaaito

ここでa is an Objectb(null)ではないObjectそれはnull参照です

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

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

ここです 私の同じような答え

9
user467871

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

9
templatetypedef

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

ここでaは、空の文字列であることが起こるオブジェクトを参照しています。 b nullなので、どのオブジェクトも参照していません。

8
Shamim Hafiz

Javaでは、nullが割り当てられた参照型は値なしを持ちます。 ""が割り当てられた文字列は値を持ちます。空の文字列、つまり文字が含まれていない文字列です。変数にnullが代入されている場合は、文字列など、いかなる種類の基底オブジェクトも存在しないことを意味します。

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

String s = null;
s.length();

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

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

4
Mukesh Kumar

""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
siddhartha

オブジェクト指向プログラミング言語では、文字列型へのnull参照は文字列オブジェクトを指しておらず、それに対して何らかの操作を実行しようとするとエラーが発生するという点で、空の文字列はnull参照とは異なります。空の文字列は、まだ文字列操作を試みることができる文字列です。

ウィキペディアの記事から 空の文字列

1
weltraumpirat

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

0
Bibiana

String s=null;

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

String t="null";

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

String u="";

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

0

この概念は数学からよりよく理解することができます。 7/0などの計算機を使用して、(ゼロではない)数値を0で除算したことがありますか? undefinednot a numbernullなどのような結果が得られます。これは、何らかの理由で操作が不可能であることを意味します(これらの理由については後日説明します)。

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

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

0
user8715994

空の文字列は空白の文字列ですが、有効なメモリアドレスを保持しています。しかしNULLポインタは何も指しません。

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

0
Shirley V

書くとき

String a = "";

値 ""を持つ文字列プール内のオブジェクト参照を指す文字列型の変数 'a'があることを意味します。変数aは有効な文字列オブジェクト参照を保持しているので、stringのすべてのメソッドをここで適用できます。

あなたが書くとき

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

簡単に言えば、

  • 「」は空ですString

  • nullは空ですString Variable

0
RoboAlex