• ベストアンサー

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("等しい");にしました。

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

  • ベストアンサー
  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.2

>String str = new String("default"); >if (x == y) str = new String("等しい"); >if (x == y) str = "等しい"; どちらでも動くと思いますがVM上でのオブジェクトの作られ方違いが有ります。 始めにnewをしていますからその段階でVM上にStringクラスのstrという名前のオブジェクトに"default"と言う文字列がコンストラクタで定義され作成されます。 前者のように新しくnew仕直してstrオブジェクトを作り直していますのでVM内のポインタは新しくなり新しいstrオブジェクトがメモリ上に作成され直すわけです。 後者の場合は既に作ったstrというStringオブジェクトの内容を入れ替えます。 後者の方が高速ですしガーベージコレクション(メモリの整理)をJavaVMが起こしたときに早く復帰できるはずです。 また、Stringオブジェクトをstaticに持った場合やマルチスレッドなプログラムを作り始めたときにこの辺りを整理しておかないと酷い目に遭うこともあります。

rasuck
質問者

お礼

String str = new String("等しい"); String str = "等しい"; では、下の方が好ましいと書いてある本をよく見かけます。 でもまだコンストラクタとは何なのかが分かっていないから 今理解するのは無理だと思いました。 でも、とても知りたい部分でもあります。 ありがとうございました。

その他の回答 (2)

  • COOKY2
  • ベストアンサー率28% (2/7)
回答No.3

Stringは、new しなくても使えます。(してもかまいませんが、) で、前者の String str = new String("default"); if (x == y) str = new String("等しい"); は、動くかもしれませんが、if文の中で、さらにnewしているのが、変ですね。上書きの様に見えますので、下手すると、if文の中でしか使えないString変数strになるかもしれません。 私なら、 String str = "defaurt"; if(x == y)str = "等しい"; と記述します。 new する記述なら、 String str = new String("default"); if(x == y)str = "等しい"; もしくは、 String str = new String(); str = "default"; if(x == y)str = "等しい"; ってとこでしょうか。

rasuck
質問者

お礼

ありがとうございます。えらくなるまでnewしないようにします。

回答No.1

動いたのならそれで問題ないと思いますが。 ちなみに >String str = new String("default"); >if (x == y) str = "等しい"; をやってみましたが、ちゃんと動きました。 無効というのがよくわからないのですが、 コンパイルできないということなのか、 if文が実行されないということなのか、 いずれにせよ別の場所の問題だと思います。 Stringはnewしなくても、 String str = "default"; if (x == y) str = "等しい"; でも動くと思います。

rasuck
質問者

お礼

無効というのは、実行しても、その部分が実行されなかったように見えた という意味で書きました。 できなかった原因は別の場所でした。 x == y というのを、equalで比較するとうまくいきました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう