
No.3ベストアンサー
- 回答日時:
あー、違う。
けっこう勘違いしている人多いんだけど。String str = "Hoge";
String str = new String("Hoge");
これは、実は「別のもの」なんだよ。コンパイル時に、"Hoge"がnew String("Hoge")に変換されたりはしない。なぜなら、これはJava内部ではまったく別のことを行っているからだ。実際、コンパイルしたものをデコンパイルしてみるとわかる。"Hello"は”Hello"だし、new Stringはnew Stringのままだ。これらは、シンタックスシュガーじゃない。それぞれ「別のことを行っている文法」なんだよ。
これは、Javaの中でもかなり引っかかる部分なんだが、実は、"Hello"は、「Hello」というStringオブジェクト「ではない」んだ。これは、うーん、Java仮想マシンの仕組みがわからないとうまく説明できないんだが。
ま、手っ取り早くいっちまえば、「Stringリテラルは、Javaの内部では特別なものとして扱われている」ということ。String str = "Hello";みたいにソースコード内にStringリテラルが登場すると、Java仮想マシンは定数プールと呼ばれるところにその値を保管し、次に同じリテラルが登場するとその定数プールに保管した値の参照を変数に渡す。つまり、
String a1 = "Hello";
String a2 = "Hello";
こんなふうにすると、a1にもa2にも常に同じオブジェクトへの参照が渡される(つまりどちらの変数も同じオブジェクトを見ている)。ところが、
String b1 = new String("Hello");
String b2 = new String("Hello");
このようにnew Stringすると、Java仮想マシンは、定数プールではなく、通常のオブジェクトを配置するヒープ内に新たにインスタンスを作成し、その参照を設定する。つまりこの場合、b1とb2は、それぞれ別のStringオブジェクトを参照していることになる。ためしに、
System.out.println(a1 == a2);
System.out.println(b1 == b2);
System.out.println(a1 == b1);
このように、変数の参照が等しいかどうかをチェックすると、a1とa2は等しいが、b1とb2は等しくないし、またa1とb1も等しくないことがわかる。これらは、それぞれ別のオブジェクトを参照してるんだ。いずれもテキストとしての値はすべて「Hello」なんだが、内部的にはまったく別のものだ。
というわけで、特別な理由がない限り、Stringを変数に設定する場合は、String str = "Hello";というようにリテラルを直接指定し、new Stringは使わない。そうすることにより、Stringオブジェクトを必要最低限で済ませることができ、メモリにもまたパフォーマンス的にもよい結果となる(ま、実際はほとんど違いはないけどな)。
ただし、この「StringリテラルとStringインスタンスは別のものだ」ということを利用して、わざとnew Stringを使うこともある。が、このへんは、もう少しJavaに慣れてから知ればいいことだろう。
No.4
- 回答日時:
回答#3を拝見して私の認識も今まで違っていたことが分かりました。
失礼しました。
リテラルプールにStringリテラルが格納されて、重複するリテラルについてはその参照がプール内に1つだけコピーが保持されるんですね。
納得しました。
ありがとうございます。
参考URL:http://codezine.jp/article/detail/2915
No.2
- 回答日時:
Javaではソースコードのコンパイル時に、自動的にソースコードが変換・付加されるものがいくつかあります。
String str = "hoge";
もその1つです。実際にコンパイルされる時ときには
String str = new String("hoge");
と変換されコンパイルされます。
その他、クラス内にデフォルトコンストラクタ(引数なしのコンストラクタ)を実装しなかった場合、コンパイル時に自動的に付加されたりします。
この回答へのお礼
お礼日時:2009/06/16 14:10
ありがとうございます!自動的に付加されるものって多いですよねー
サブクラスのコンストラクタで、スーパークラスのコンストラクタが自動で呼び出されるとか。結構そこで迷っちゃいます><
No.1
- 回答日時:
「""」で囲った構文というのは
"hoge" と、new String("hoge") は、まったく同じ意味として解釈されます。
"hoge"と書くと、自動的にString型の実体をnewで作っているのと同じです。
つまり、(1)の一行目、
String str = new String();
は、少しムダな処理をしていることになります。
ここでメモリを確保してString型の新しい実体を生成していますが、
次の行ではメモリの別の場所に確保された別の実体が割り当てられ、
結果的に、1行目で作ったほうの実体はガベージコレクションで破棄されてしまいます。
(1)のように書くのなら、
String str = null;
str = "hoge";
このようにするのが良いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Visual Basic(VBA) エラー処理 3 2022/04/11 14:58
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Excel(エクセル) 【VBAファイル移動】2つのマクロを順に実行。1つ目のマクロが実行不可⇒2つ目が実行不可となる件 2 2022/07/29 12:17
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
ワイルドカード<?>と型パラメー...
-
戻り値がクラスオブジェクト
-
距離変換画像について
-
マルチスレッド下でのインスタ...
-
オブジェクトに値を保持させる...
-
VBAのFileSearchと同じことをV...
-
DynaactionFormで困っています。
-
Vbで通常使用するプリンターを...
-
SQLException
-
サブクラス化
-
VBからBATファイルを起動して戻...
-
質問すいません。 javascriptの...
-
Excel VBA : イコールになら...
-
VBAのWindowオブジェクトとWork...
-
VBScriptで計算して出た値をク...
-
printerオブジェクトでのテキス...
-
C#でフォームのオブジェクト名...
-
開始日(Date型)から終了日(Date...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
VBAのWindowオブジェクトとWork...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
Object型からDouble型へのキャスト
-
COMコンポーネントって何?
-
error C2712: オブジェクト ア...
-
CoCreateInstanceでエラーになる。
-
LISTBOXの内容が更新されま...
-
Accessの連結・非連結オブジェ...
-
オブジェクトレベルとメタレベル
-
多人数のじゃんけんプログラム
-
C++でのクラスオブジェクトの破棄
-
.getElementById()のエラーにつ...
-
Rangeオブジェクトを一時的に作...
おすすめ情報