初歩的な質問です。どうぞよろしくお願いします。
String s = null;
String ss = "";
この違いが理解できていません。この状態だと、sには何も入っていない状態ということですよね。また、ssには""が入っている状態ということですよね。
しかし、「""が入っている状態」というのは、「"」「"」の間にある文字が入っているということだと思うのですが、私の見たところ、「""」の「"」と「"」の間にはひとつの文字もないので、これは何も入っていない状態と変わらないのではないでしょうか。つまりnullと同じ意味になるのではないでしょうか。
また
String s = new String();
String ss = "";
の違いは何でしょうか。
何卒ご教授くださいますようよろしくお願いします。
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発生
/* ------- コードここまで ------- */
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 …
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の性質上、ポインタ渡しでのデータ参照が基本であることがプログラムを作っていく上で頭に入れておく必要があります。
No.1
- 回答日時:
String s = null; <-これはsは宣言しているけど、「Stringオブジェクト」を作っていない状態です。
String ss = ""; <-これはssを宣言し、「文字が入っていないStringオブジェクト」を作った状態です。
String s = new String();
String ss = "";
これは同じだと思いますが、ちょっと細かい点は自信がありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 空文字 "" ですが 空文字の意味を教えてください。 3 2022/08/05 03:51
- PHP ここで言う空文字の意味とは? 1 2022/08/05 16:27
- Perl perlについての質問 2 2022/10/17 15:25
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
Object型からDouble型へのキャスト
-
C#でフォームのオブジェクト名...
-
Vbで通常使用するプリンターを...
-
JAVAからHTMLへ値を返す方法
-
ワイルドカード<?>と型パラメー...
-
Accessの連結・非連結オブジェ...
-
【Java】入力した西暦→和暦に変...
-
bmp画像をjpegやpng画像に圧縮...
-
ビジュアルC++でボタンの有...
-
access2002のリレーションシッ...
-
javaでは基本型の参照渡しは無...
-
ASP.net 教えてください!!(...
-
Google Apps Scriptの時刻の計算
-
インデザインのテキスト回り込み
-
EXCEL VBAにて動的にCheckBOXを...
-
オブジェクトとは、わかりやす...
-
Listに格納されているオブジェ...
-
Alertの自動制御
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報