• ベストアンサー

String a = "a"; と String b = new String ("b"); の違い

String a = "a"; String b = new String ("b"); お伺いしたいのですが、 b は String のインスタンスを作ってると思いますが、 a はどんなことをしてるのでしょうか?

  • Java
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.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)
回答No.3

こんにちは。 わたしもjavaをはじめたてのころは意味がわかりませんでした。 zozyさんがわかりやすく説明してくださっているので、単なる追記になりますが、基本的にStringはクラスです。intはクラスではありません。ここが大きな違いです。 これからコーディングしていくうえで大変お世話になるコレクションクラスなどわかりやすいですが、必ずArrayList list = new ArrayList();のように宣言して、インスタンスをつくりますよね。あなたも質問内容からするとそこまでは理解されているようです。だから本来はStringもクラスなのでbのように宣言しなければいけない。しかし、String はあまりにも使用頻度が高いため、プリミティブ型と同じように宣言するこtが許されました。この後の説明はzozyさんがされています。 なので、クラスを呼び出すときはインスタンスを必ず作らなければならない。ただし、Stringだけは以上の理由から例外として認められている、と認識していただければいいのではないでしょうか。

noname#80901
noname#80901
回答No.2

ここが参考になるかな。。。

参考URL:
http://www.javaroad.jp/java_character2.htm
  • zozy
  • ベストアンサー率60% (20/33)
回答No.1

String a="a";とString a=new String("a"); は基本的には同じ処理をしています。 ただ、String型の変数への代入は頻繁に使うので String a=new String("a"); を省略して String a="a"; でも大丈夫なようにjavaコンパイラが勝手に補完してくれています。 このようなことを一般的にはシンタックスシュガーと言うようです。

関連するQ&A

  • new String

    まだHello Worldレベルです。 String str = new String("default"); if (x == y) str = new String("等しい"); のソースは問題無いですか? newで文字を作って、またnewで文字を書き替えているところが心配です。 String str = new String("default"); if (x == y) str = "等しい"; だと、それが無効だっから、new String("等しい");にしました。

    • ベストアンサー
    • Java
  • String str = "a\\b\\c";

    String str = "a\\b\\c"; という文字列があった時に、a,b,cで分割したいのですが、どのようにsplitさせれば出来るでしょうか?

    • ベストアンサー
    • Java
  • newを書く場所とか挙動について、分からないので

    newについて、幾つか分からないことがあるので、教えてください ■newしたら、その状態はどこまで保持されるのでしょうか? あるサイトに、 >PHPスクリプトは、処理が全て終了すると共に、メモリは開放されます と書かれていたのですが、 この場合の「処理」は、何を意味するのでしょうか? ファイルの一番最後まで来たら、newで確保した何かは自動的に解放される、 という意味でしょうか? <例> ・a.php ・b.php ・c.php … クラス記述 ・aからbへPOST ・aでもbでも、cのクラスを利用したい この場合、a、b両方のファイルに、必ず、new C と書かなければいけないのでしょうか? それとも、ファイルaにだけ、new C と書いて、 bで、require_once("a.php");としてもよいのでしょうか? あるいは、他に何か書き方があるのでしょうか? <選択肢> ・使いたいファイルで必ずnewする必要がある ・使いたいファイルで必ずしもnewする必要はない ■インスタンス名は違ってもよいのでしょうか? 上記例で、 ・ファイルaに、hoge1=new C; ・ファイルbに、hoge2=new C; とやってみたらエラーにならなかったのですが、 ということは、例えば同じクラスを複数のファイルで利用したい場合、 どうするのがいいのでしょうか? <選択肢> ・new する際、常に同じインスタンス名を利用 ・new する際、ファイル毎に異なるインスタンス名を利用 ・new する際のインスタンス名は、同じでも違っても、どっちでもよい

    • ベストアンサー
    • PHP
  • Map<String, String> Hash = new Hash

    Map<String, String> Hash = new HashMap<String, String>(); このjavaのハッシュマップの初期化の方法を教えてください。

    • ベストアンサー
    • Java
  • newは明示的にした方が良いのか?

    インスタンス生成時、メモリを確保するためにnewします。 その時に疑問が生まれました。以下の書き方は何が違うのでしょうか。 そしてどちらが推奨されるのでしょうか? (1) newを明示的に実施 String str = new String(); str = "hoge"; (2) newは明示的にしない String str = "hoge";

    • ベストアンサー
    • Java
  • A a = new A(){}; の構文の意味が分からない。

    下記サイトのコードを読んでいて、 ResponseListener listener = new ResponseListener() { //略 }; という書き方があったのですが、どういう意味になるのでしょうか? インスタンスの作り方は単に A a = new A(); だと思うのですが…。 http://www.snmp4j.org/doc/org/snmp4j/Snmp.html

    • ベストアンサー
    • Java
  • $a = new SomeClass();

    <html> <head> <meta "charset=utf-8" /> <title>P76instanceof.php</title> </head> <body> <?php class SomeClass { } $a = new SomeClass(); if ($a instanceof SomeClass){ echo'$aは SomeClass のインスタンスです',PHP_EOL; } ?> </body> </html>    以上ですが!  $a = new SomeClass();のnewの役割を教えてくだい  よろしくお願いします。

    • ベストアンサー
    • PHP
  • JavaのString[]をnewした時の値について。

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

    • ベストアンサー
    • Java
  • [C#] string name = new ..

    こんにちは。 string name; name = "sukeken"; これを、オブジェクト指向プログラミングらしく string name = new string("sukeken"); とするのは、ダメなのでしょうか? コンパイルは、許してくれないようなのですが…。 同じように、intもダメでしょうか? 環境 VisualStudio2012 C# よろしくお願いいたします。

  • StringBuilderをStringに代入

    StringBuilderを使って文字列連結して、それをSQL文(String型)として利用するプログラムを作りました。 ※SQLはループ処理で約10万個ぐらい発行→実行します StringBuilderの文字列を、最終的にString型の変数(strSql)に代入するのですが、 下記のどちらで代入する方がコスト掛からないでしょうか? A案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = new String(sb); ---------- B案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = sb.toString(); ---------- 教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう