No.1
- 回答日時:
「""」で囲った構文というのは
"hoge" と、new String("hoge") は、まったく同じ意味として解釈されます。
"hoge"と書くと、自動的にString型の実体をnewで作っているのと同じです。
つまり、(1)の一行目、
String str = new String();
は、少しムダな処理をしていることになります。
ここでメモリを確保してString型の新しい実体を生成していますが、
次の行ではメモリの別の場所に確保された別の実体が割り当てられ、
結果的に、1行目で作ったほうの実体はガベージコレクションで破棄されてしまいます。
(1)のように書くのなら、
String str = null;
str = "hoge";
このようにするのが良いです。
No.2
- 回答日時:
Javaではソースコードのコンパイル時に、自動的にソースコードが変換・付加されるものがいくつかあります。
String str = "hoge";
もその1つです。実際にコンパイルされる時ときには
String str = new String("hoge");
と変換されコンパイルされます。
その他、クラス内にデフォルトコンストラクタ(引数なしのコンストラクタ)を実装しなかった場合、コンパイル時に自動的に付加されたりします。
この回答へのお礼
お礼日時:2009/06/16 14:10
ありがとうございます!自動的に付加されるものって多いですよねー
サブクラスのコンストラクタで、スーパークラスのコンストラクタが自動で呼び出されるとか。結構そこで迷っちゃいます><
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
お探しの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を探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
COMコンポーネントって何?
-
Vbで通常使用するプリンターを...
-
bmp画像をjpegやpng画像に圧縮...
-
文字列でクラス型名を取得したい
-
Accessの連結・非連結オブジェ...
-
VBAのWindowオブジェクトとWork...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ArrayLsitのデータ取得
-
Listに格納されているオブジェ...
-
Listに格納されたオブジェクト...
-
JAVAからHTMLへ値を返す方法
-
Visual Studioでのbmpファイル...
-
.getElementById()のエラーにつ...
-
javaでは基本型の参照渡しは無...
-
LISTBOXの内容が更新されま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報