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");
と変換されコンパイルされます。
その他、クラス内にデフォルトコンストラクタ(引数なしのコンストラクタ)を実装しなかった場合、コンパイル時に自動的に付加されたりします。
ありがとうございます!自動的に付加されるものって多いですよねー
サブクラスのコンストラクタで、スーパークラスのコンストラクタが自動で呼び出されるとか。結構そこで迷っちゃいます><
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も見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
一番最初にネットにつないだのはいつ?
ネットユーザーもいろんな世代が生まれていますが、始めて接続したときのワクワクは同じはず! 人生で一番最初にネットに接続したときの思い出を教えて下さい。
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
前回の年越しの瞬間、何してた?
いよいよ2025年がやってきますね。 年越しのスタイルは人それぞれ。 2024年を迎える瞬間は何をしていましたか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
newしないインスタンス?実体化しなくてもいいの?
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
VBA 同じ名前のオブジェクトを...
-
Excelで =EMBED("Acrobat Docu...
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
VBからBATファイルを起動して戻...
-
CFileDialogでフォルダだけを選...
-
インデザインのテキスト回り込み
-
VBAのWindowオブジェクトとWork...
-
戻り値がクラスオブジェクト
-
ブラウザ上でEXCELの印刷...
-
Strutsのbeanタグについて
-
Excel VBA : イコールになら...
-
.getElementById()のエラーにつ...
-
複数プロジェクト間での値渡し
-
多人数のじゃんけんプログラム
-
LISTBOXの内容が更新されま...
-
VB6-オブジェクトを配列にセット
-
Accessの連結・非連結オブジェ...
-
ArrayLsitのデータ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
C#でフォームのオブジェクト名...
-
VBA 同じ名前のオブジェクトを...
-
VBAのWindowオブジェクトとWork...
-
ワイルドカード<?>と型パラメー...
-
LISTBOXの内容が更新されま...
-
error C2712: オブジェクト ア...
-
Object型からDouble型へのキャスト
-
ビジュアルC++でボタンの有...
-
オブジェクトレベルとメタレベル
-
戻り値がクラスオブジェクト
-
オブジェクトに値を保持させる...
-
ASP.net 教えてください!!(...
-
時間帯判定をする。
-
Vbで通常使用するプリンターを...
-
Accessの連結・非連結オブジェ...
-
COMコンポーネントって何?
-
JAVAからHTMLへ値を返す方法
おすすめ情報