null
と""
(空の文字列)の違いは何ですか?
簡単なコードを書きました。
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
どちらのステートメントもfalse
を返します。私はそれらの間の実際の違いが何かを見つけることができないようです。
""は空の文字列ですが、実際の文字列です。
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のように初期化されたもの)になります。そのため、==がどのように機能するかについて誤った判断を下す可能性があるので注意してください。
文字列はオブジェクトであり、nullでもかまいません
nullは、Stringオブジェクトがインスタンス化されていないことを意味します
""は "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は空の変数です - 文字通り何もありません。
ここでa is an Object
がb(null)
はではないObjectそれはnull参照です
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
ここです 私の同じような答え
両者にはかなり大きな違いがあります。空の文字列""
は、「文字が含まれていない文字列」です。それは明確に定義された長さを持つ実際の文字列です。標準の文字列操作はすべて空の文字列に対して明確に定義されています。小文字に変換したり、その中の文字のインデックスを検索したりすることができます。null文字列null
は「文字列がまったくない」です。文字列ではないので長さはありません。 NULL文字列に標準の文字列操作を適用しようとすると、実行時にNullPointerException
が発生します。
null名前がインスタンス化されたオブジェクトを参照していないことを意味します。 ""は空の文字列を意味します。
ここでaは、空の文字列であることが起こるオブジェクトを参照しています。 b nullなので、どのオブジェクトも参照していません。
Javaでは、null
が割り当てられた参照型は値なしを持ちます。 ""
が割り当てられた文字列は値を持ちます。空の文字列、つまり文字が含まれていない文字列です。変数にnull
が代入されている場合は、文字列など、いかなる種類の基底オブジェクトも存在しないことを意味します。
String s = "";
s.length();
String s = null;
s.length();
空の文字列""
への参照は、ヒープ内のオブジェクトを指しているので、そのメソッドを呼び出すことができます。
しかし、null
を指す参照にはヒープ内を指すオブジェクトがないため、NullPointerException
が得られます。
""と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参照とは異なります。空の文字列は、まだ文字列操作を試みることができる文字列です。
ウィキペディアの記事から 空の文字列 。
文字列は空にすることもnull
値を指定することもできます。文字列がnull
の場合、メモリ内のものを参照していません。 s.length()>0
を試してください。これは、文字列が空の場合でも長さ0が返されるためです。そのため、何も入力しなくても、文字列はnull
として登録されないため、引き続きループします。長さをチェックすると、ループから抜けます。
String s=null;
文字列がnullに初期化されていません。何らかの文字列操作が試行された場合、nullポインタ例外がスローされる可能性があります。
String t="null";
それはt = "xyz"のように同じ値文字列 "null"を持つ文字列リテラルです。 nullポインタをスローしません。
String u="";
空の文字列として、nullポインタをスローしません。
この概念は数学からよりよく理解することができます。 7/0などの計算機を使用して、(ゼロではない)数値を0で除算したことがありますか? undefined
、not a number
、null
などのような結果が得られます。これは、何らかの理由で操作が不可能であることを意味します(これらの理由については後日説明します)。
今、これを実行します:0/7。出力は0になります。これは、操作が可能で実行可能であることを意味しますが、除算後に何も残らないため、答えは0になります。有効な出力があり、その出力はゼロです。
最初の例では、出力が無効であるだけでなく、操作を実行することもできませんでした。これは、Javaのnull
文字列に似ています。 2番目の例は、empty
文字列に似ています。
空の文字列は空白の文字列ですが、有効なメモリアドレスを保持しています。しかしNULLポインタは何も指しません。
https://shirleyanengineer.blogspot.com/2019/01/does-empty-string-has-address.html
書くとき
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
簡単に言えば、
「」は空ですString
nullは空ですString Variable。