String str1 = new String("str1");
String str2 = new String("str1");
String str3 = "str1";
if(str1 == str2){
System.out.println("same!");
}
if(str1 == str3){
System.out.println("same!");
}
上記のコードで実行すると、"same!"が実行されません。
Stringオブジェクトには定数プールがあって、新たにStringオブジェクトが作成されたとき、定数プールに入っているそれまでに存在していたStringオブジェクトの値と同じであったら、新たにStringオブジェクトを作らず、それまでにあったStringオブジェクトの参照を当てるということなのです。
それに従えば、str2,str3はstr1と同じStringオブジェクトを参照しているはずだから、if文の結果はtrueになるはずなんですが、、、。
適切な回答をいただきたく思います。よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!
やはりそうですね!!
どこかで見たような問題だと思いました!
普通の入門書にはあまり記述されていないけれど、
重要な部分ですね。
この問題は結構ややこしいのですが、
出題しやすいので、必ずでます。
例えば、
プリミティブ型を比較したり、
ラッパークラスを比較したり、
それこそStringを比較等々ですね。
引っ掛けで良くあるのが、
プリミティブ型をequals()で比較すると言う問題です。
equals()の引数にはプリミティブ型は取れないのでコンパイルエラーになります。
が、ラッパークラスであればequals()の引数にとることが出来ますね。
比較的得点しやすい問題なので、
きっちりおさえておきましょう。
僕でも受かったので大丈夫です(^O^)
ファイト!です!!
No.2
- 回答日時:
ちょっと自信がないのですが
この場合
オブジェクト参照変数は3つ、
Stringオブジェクトは1つ、作られています。
つまりstr1とstr2は、
「箱の中身」は同じStringオブジェクトではありますが、
「同じ変数」ではありません。
「箱の中身」を比較したいときにはequals()、
「変数そのもの」を比較したいとき(プリミティブ型は箱の中身でもこちらになる)==をつかうのです。
参照先は同じでも、
equalS()であっても、==ではない、
と言うことになります。
SUNの認定試験で同じような問題が出ます。
私も意味がわからなくて混乱しました。
なるほど!よく分かりました。ありがとうございます(^0^)!
お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!
No.1
- 回答日時:
定数プールに同じ文字列が存在してもnewした場合は新しいオブジェクトが
作成されるのでstr1、str2、str3は別のオブジェクトになります。
String str1 = "str1";
String str2 = "str1";
String str3 = "str1";
とすればstr1、str2、str3は定数プールの"str1"オブジェクトを
参照することになり"same!"が表示されます。
なるほど!よく分かりました。ありがとうございます(^0^)!
no2にもお書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
関連するカテゴリから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関数から、別シー...
おすすめ情報