- ベストアンサー
初歩の質問 nullについて
初歩的な質問です。どうぞよろしくお願いします。 String s = null; String ss = ""; この違いが理解できていません。この状態だと、sには何も入っていない状態ということですよね。また、ssには""が入っている状態ということですよね。 しかし、「""が入っている状態」というのは、「"」「"」の間にある文字が入っているということだと思うのですが、私の見たところ、「""」の「"」と「"」の間にはひとつの文字もないので、これは何も入っていない状態と変わらないのではないでしょうか。つまりnullと同じ意味になるのではないでしょうか。 また String s = new String(); String ss = ""; の違いは何でしょうか。 何卒ご教授くださいますようよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
piepiepieさんの回答にちょっと補足します。 > Te-Shoさんの回答についてですが、 > ほとんど間違いと思われます。 > > ArrayListを使った例を実行してみればわかりますが、 > どちらも["a","b"}になります。 これはpiepiepieさんがおっしゃる通り、どちらも["a","b"]になります。 > String s = new String(); > String ss = ""; > はまったく同じです。 これは少し間違っていて、正確には「"機能は"まったく同じ」です。 sやssの各メソッドを呼び出したときには同じ動きをします。異なるのは、== を使って判定を行ったときです。以下のコードを実行すると、右側のコメントの通り出力されます。 /* ------- コードここから ------- */ String s = new String(); String ss = "";/* (2) */ // equalsメソッドによる比較 System.out.println(s.equals(ss)); // true System.out.println(ss.equals(s)); // true // == による比較 System.out.println(s == ss); // false System.out.println(ss == s); // false // 文字リテラルとの比較 System.out.println(s.equals("")); // true System.out.println(ss.equals("")); // true /* (2) */System.out.println(s == ""); // true System.out.println(ss == ""); // false // new String() との比較 System.out.println(s.equals(new String())); // true System.out.println(ss.equals(new String())); // true System.out.println(s == new String()); // false System.out.println(ss == new String()); // false /* ------- コードここまで ------- */ 結果は、以下の2点です。 ・equalsによる比較はtrueとなる。 → 各Stringインスタンスが提供する機能は同じ ・基本的に、==による比較はfalseとなる。 → 各Stringは、VM上異なる場所に格納されている違う部品 これから外れているのは、(2)とコメントした箇所です。 (1)でsに代入した""と、(2)の等式に記述された""が、==の比較でtrueを返します。 同一メソッド内であれば、文字リテラル(""や"abc"のようにコード中に""を使って書かれている文字列)は同一のインスタンス が使用されることになっています。 ※1 これは、メモリ効率などの点から作られたVMの仕様です。 ※2 VMによっては、別のクラスにある文字リテラルが 同一インスタンスになっていたりもします。 ついでに、nullとの比較です。上のコードのすぐ後ろに追加して実行します。 nullはどんな文字列とも等しくありません。nullですから、equalsメソッドを呼ぼうとするとNullPointerExceptionが発生します。 /* ------- コードここから ------- */ String n = null; System.out.println(s.equals(n)); // false System.out.println(ss.equals(n)); // false System.out.println(s == n); // false System.out.println(ss == n); // false System.out.println(n.equals(s)); // ※NullPiointerException発生 /* ------- コードここまで ------- */
その他の回答 (4)
- piepiepie
- ベストアンサー率0% (0/1)
#3のpiepiepieです. 失礼致しました. String s = new String(); String ss = new String(); も「まったく同じ」ではないですからね. Java言語のまえに日本語から勉強せねば….
- piepiepie
- ベストアンサー率0% (0/1)
String s = null; は「文字列がない」 String ss = ""; は「長さ0の文字列がある」 日本語で言えばこうなり、違います。 String s = new String(); String ss = ""; はまったく同じです。 ちなみに String str = "abc"; と char data[] = {'a', 'b', 'c'}; String str = new String(data); は同じだそうです。 (参考URL) Te-Shoさんの回答についてですが、 ほとんど間違いと思われます。 ArrayListを使った例を実行してみればわかりますが、 どちらも["a","b"}になります。 以上です。
- Te-Sho
- ベストアンサー率52% (247/472)
まず String s = null; はStringクラスのオブジェクトを定義しているだけですね。 値は設定されていないのでJavaVM上にsと言うオブジェクトは作られていません(メモリ上にない。)。よってメモリ上に格納される為のポインタ(格納位置)が空白となります。 このままsのStringオブジェクトになにか文字列を格納しようとしてもsのポインタは空白ですのでNullPointerExceptionとなり実行時にエラーとなります。 String ss = ""; はすでにJavaVM上に作成されているssというオブジェクトに長さ0の文字列を代入するということになります。 s.length()とした場合はNullPointerExceptionとなり、ss.length()とした場合は0が帰ってくることですね。 新しくオブジェクトを作るときには String s = new String();と新しくJavaVM上にStringクラスのオブジェクトを作ってあげることになります。 String s = new String();と String ss = ""; の違いとしては、sはJavaVM上に新しいポインタでオブジェクトを作るということで、ssは既にあるポインタの文字列を長さ0にすると言うことです。 結果は同じですが新しいオブジェクトが作られるかどうかの違いがあります。 例としてArrayListにStringクラスを格納してみると分かります。 ArrayList array = new ArrayList(); String a = new String(); a = "a"; array.add(a); a = "b"; array.add(a); とした場合、配列に格納されているオブジェクトのポインタ(格納位置)は同じ為、取り出したときに{"b","b"}という結果となります。(上書きされてしまう。) しかし ArrayList array = new ArrayList(); String a = new String(); a = "a"; array.add(a); a = new String(); <=ここでもう一度newする。 a = "b"; array.add(a); とした場合、1回目に格納されたaと2回目に格納されたaのポインタ(格納位置)は異なるために配列の中身は{"a","b"}となります。 Javaの性質上、ポインタ渡しでのデータ参照が基本であることがプログラムを作っていく上で頭に入れておく必要があります。
String s = null; <-これはsは宣言しているけど、「Stringオブジェクト」を作っていない状態です。 String ss = ""; <-これはssを宣言し、「文字が入っていないStringオブジェクト」を作った状態です。 String s = new String(); String ss = ""; これは同じだと思いますが、ちょっと細かい点は自信がありません。