• ベストアンサー

初歩の質問 nullについて

初歩的な質問です。どうぞよろしくお願いします。 String s = null; String ss = ""; この違いが理解できていません。この状態だと、sには何も入っていない状態ということですよね。また、ssには""が入っている状態ということですよね。 しかし、「""が入っている状態」というのは、「"」「"」の間にある文字が入っているということだと思うのですが、私の見たところ、「""」の「"」と「"」の間にはひとつの文字もないので、これは何も入っていない状態と変わらないのではないでしょうか。つまりnullと同じ意味になるのではないでしょうか。 また String s = new String(); String ss = ""; の違いは何でしょうか。 何卒ご教授くださいますようよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.4

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)

回答No.5

#3のpiepiepieです. 失礼致しました. String s = new String(); String ss = new String(); も「まったく同じ」ではないですからね. Java言語のまえに日本語から勉強せねば….

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

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"}になります。 以上です。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/String.html
全文を見る
すると、全ての回答が全文表示されます。
  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.2

まず 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の性質上、ポインタ渡しでのデータ参照が基本であることがプログラムを作っていく上で頭に入れておく必要があります。

全文を見る
すると、全ての回答が全文表示されます。
noname#86752
noname#86752
回答No.1

String s = null; <-これはsは宣言しているけど、「Stringオブジェクト」を作っていない状態です。 String ss = ""; <-これはssを宣言し、「文字が入っていないStringオブジェクト」を作った状態です。 String s = new String(); String ss = ""; これは同じだと思いますが、ちょっと細かい点は自信がありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • (String)nullはnullではなく文字列?

    引数として、(String)nullを渡しているコードがあるのですが、 これは「null」ではなく文字列としての「null」を渡しているのでしょうか? ・Stringでキャストしていると思うのですが、nullもキャストできるのでしょうか? ・それとも何か特別な意味がある?

    • ベストアンサー
    • Java
  • NULLが返ってこない…。

    原因がわからないため質問をさせて頂きます。 <%-- JSP <input type="text" name="name"> //名前 String name = request.getParameter("name"); Data data = new Data(); //コンストラクタをnew data.setName(name); --%> <%-- class(Bean) private String n = null; public void setName(String name){ if(name != null){ n = name; }else{ n = null; } public String getName(){ if(name != null){ return name; }else{ return name; } } --%> 値をgetParameter()メソッドで取得をして 値をsetName(name);でセットをしています。 セットした側でもし値があるのであれば その値を変数に格納。 もし値がなければnullを変数に格納しています。 しかし System.out.println(data.getName().equals("");//true System.out.println(data.getName().equals(null);//false; となりnullを返してくれません…。 このコードに何を足したらnullを返してくれるのか わかりません。 わかる方がいらっしゃいましたらよろしくお願い致します。

    • ベストアンサー
    • Java
  • 例外、null

    Cinクラスでは,BufferedReaderクラスで定義されたreadLineメソッドを使って, 一行ずつ入力を行っている。 class Cin { private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); public static String getLine() { String s = ""; try { s = in.readLine(); } catch (IOException e) { System.out.println("IO error!"); System.exit(1); } return s; } } このreadLineメソッドは,入力の終わりに到達するとnullを返し, それ以外の入力エラーがあるとIOException(Exceptionクラスのサブクラス)を投げる。 また入力の終わりに到達したことを,例外を用いて通知することも可能である。 readLineメソッドが,入力に関する状態を示すのに,「例外」、「nullを返す」 という二つの方法を使っているのにはどういう理由があるのか教えて下さい。

  • JavaのString[]をnewした時の値について。

    JavaのString[]をnewした時の値について。 どなたか、分かる方がいらっしゃいましたらご教授下さい。 JavaでString[]をnewしたとき、String[]の値には「null」が入りますか? それとも、「""」 空要素が入りますか? また、Stringの「""」と「null」の違いはなんですか?

    • ベストアンサー
    • Java
  • とても初歩的な質問

    ほっんとに初歩的な質問で申し訳ないのですが StringBuffer s1 = new StringBuffer("Java"); StringBuffer s2 = new StringBuffer("HTML"); S1とS2が次のように与えられていて、s1.delete(1,3)という操作をしたときに何故答えが「Ja」になるらしんですが何故そうなるのですか? 1番目と3番目を消したら「Jv」になるのではないんですか? 大学の授業をまったく聞いていなかったのでわかりません。どなたか解説お願いします。

  • AccessのNULL値とSQL ServerのNULL値で違いはありますか?

    SQL ServerのテーブルをAccessにODBCでリンクを貼っています。 AccessでSQL ServerのNULL項目を表示した際に挙動がおかしくなったので… そこでSQL ServerのテーブルのNULL値を空文字("")にしたら正常になりました。 AccessのNULL値とSQL ServerのNULL値で違いはありますか? ご存知の方がいましたらご教授お願いします。

  • 空の文字列とnullと""

    java初心者です。 空の文字列とnullと""の3つの関係がよくわかりません。 TextFieldを使った簡単なプログラムを作りました。そこで、”TextFieldに何も入力されていないこと”を判定する文を書こうと思ったのですが、どう書けばいいのか迷いました。 TextFieldのオブジェクトをtfとして、tf.getText()==""かtf.getText()==nullで大丈夫だと思いましたが、実行してみると、どちらを用いても判定できませんでした。結局、tf.getText().length()==0で判定できました。そこで、リファレンスを見ると、getText()はデフォルトで空の文字列を返すと、書いてありました。 したがって、「""とnullは空の文字列とは異なる」という理解に至ったのですが、では空の文字列とは何なのかという疑問がわいてきました。 また、自分は""とnullの違いもよくわかっていません。""とnullが異なるものである、ということはわかるのですが・・・ 質問をまとめると ・空の文字列とは何なのか? ・空の文字列は""やnullとどう違うのか? です。よろしくお願いします。

    • ベストアンサー
    • Java
  • 「C#」SQL実行でのNULL値の処理方法

    質問は下記のとおりです。よろしくお願いいたします。 SqlCommand s_h1 = new SqlCommand("select sum(人数) from データ where 日付 >= '2008-04-01 00:00:00' and 日付 <= '2008-04-30 23:59:59', con); int h1 = (int)s_h1.ExecuteScalar(); で実行すると「指定されたキャストは有効ではありません。」とエラーが出ます。SQLで実行するとデータが無いため、値は「NULL」となっているのでintにキャストが出来ないというのは理解しました。 出来れば「NULL」の場合は「0」という数字にしたいのですが、この処理方法をご教授お願いいたします。

  • ポインタと配列

    初歩的な質問なんですが、 #include <stdio.h> #include <string.h> main() { char ss[10]; char *p; strcpy(ss,"ABCDE"); p=ss; while(*p){ *p=*p+1; ++p; } printf("ss=%s\n",ss); } で実行結果が ss=BCDEF になります。 while(*p){ *p=*p+1; ++p; } の部分がどうしても理解できません。 参考書にも、解説が載ってなくて困っています。 ご教授宜しくお願いします。

  • 初歩的な質問なのですが・・・

    初歩的な質問なのですが、微分積分のときに出でくる∫f(x)dx、d/dxのdとdxってどういう意味を表しているのですか?あとd/dxで何故微分という意味になるのですか?いままで意識せずに機械的に解いてきたのであまりよく理解できていません。よろしくお願いします。

このQ&Aのポイント
  • ブラザー製品の紙詰まり解除カバーが印刷時に勢いよく開いてしまうトラブルについて相談します。
  • 年賀状印刷のために購入したブラザー製品のDCP-J926Nですが、印刷するたびに紙詰まり解除カバーが勢いよく開いてしまいます。テープで固定していますが、正常な状態で印刷できる方法はありますか?
  • 接続環境や関連ソフトに問題はなく、印刷時に紙詰まり解除カバーが勢いよく開いてしまう問題に悩んでいます。年賀状を印刷する際に困らないような対処方法を教えてください。
回答を見る