- ベストアンサー
String a = "a"; と String b = new String ("b"); の違い
String a = "a"; String b = new String ("b"); お伺いしたいのですが、 b は String のインスタンスを作ってると思いますが、 a はどんなことをしてるのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
お二人の回答を具体的に言うと、こういうことです。 String a1 = "a"; String a2 = "a"; String b1 = new String ("b"); String b2 = new String ("b"); a1のために、aという文字列のインスタンスが作られますが、 a2に代入されるのは、a1に使われたインスタンスが再利用されます。 これは、 if(a1 == a2) System.out.print("a1と同じインスタンス"); の結果でもわかります。 一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その初期化に使った無名のStringインスタンスの3つがメモリ上に存在することになります。 if(b1 != b2) System.out.print("b1とは違うインスタンス"); の結果でもわかると思います。 したがって、 String b = new String ("b"); というのは、Integerに例えると Integer i = new Integer(new Integer(1)); という処理を していることになり、ひとつ無駄なインスタンス生成となります。
その他の回答 (3)
- k_rama
- ベストアンサー率50% (1/2)
こんにちは。 わたしもjavaをはじめたてのころは意味がわかりませんでした。 zozyさんがわかりやすく説明してくださっているので、単なる追記になりますが、基本的にStringはクラスです。intはクラスではありません。ここが大きな違いです。 これからコーディングしていくうえで大変お世話になるコレクションクラスなどわかりやすいですが、必ずArrayList list = new ArrayList();のように宣言して、インスタンスをつくりますよね。あなたも質問内容からするとそこまでは理解されているようです。だから本来はStringもクラスなのでbのように宣言しなければいけない。しかし、String はあまりにも使用頻度が高いため、プリミティブ型と同じように宣言するこtが許されました。この後の説明はzozyさんがされています。 なので、クラスを呼び出すときはインスタンスを必ず作らなければならない。ただし、Stringだけは以上の理由から例外として認められている、と認識していただければいいのではないでしょうか。
ここが参考になるかな。。。
- zozy
- ベストアンサー率60% (20/33)
String a="a";とString a=new String("a"); は基本的には同じ処理をしています。 ただ、String型の変数への代入は頻繁に使うので String a=new String("a"); を省略して String a="a"; でも大丈夫なようにjavaコンパイラが勝手に補完してくれています。 このようなことを一般的にはシンタックスシュガーと言うようです。