• 締切済み

String定数プールと"==演算子"との関係。

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になるはずなんですが、、、。 適切な回答をいただきたく思います。よろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数6

みんなの回答

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.4

>お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました! やはりそうですね!! どこかで見たような問題だと思いました! 普通の入門書にはあまり記述されていないけれど、 重要な部分ですね。 この問題は結構ややこしいのですが、 出題しやすいので、必ずでます。 例えば、 プリミティブ型を比較したり、 ラッパークラスを比較したり、 それこそStringを比較等々ですね。 引っ掛けで良くあるのが、 プリミティブ型をequals()で比較すると言う問題です。 equals()の引数にはプリミティブ型は取れないのでコンパイルエラーになります。 が、ラッパークラスであればequals()の引数にとることが出来ますね。 比較的得点しやすい問題なので、 きっちりおさえておきましょう。 僕でも受かったので大丈夫です(^O^) ファイト!です!!

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.3

今試して見ました。 #1の方の解答が正しいです。 new とした場合には別オブジェクト、になるのですね。

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.2

ちょっと自信がないのですが この場合 オブジェクト参照変数は3つ、 Stringオブジェクトは1つ、作られています。 つまりstr1とstr2は、 「箱の中身」は同じStringオブジェクトではありますが、 「同じ変数」ではありません。 「箱の中身」を比較したいときにはequals()、 「変数そのもの」を比較したいとき(プリミティブ型は箱の中身でもこちらになる)==をつかうのです。 参照先は同じでも、 equalS()であっても、==ではない、 と言うことになります。 SUNの認定試験で同じような問題が出ます。 私も意味がわからなくて混乱しました。

maiko_asu
質問者

お礼

なるほど!よく分かりました。ありがとうございます(^0^)! お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!

  • symgt
  • ベストアンサー率56% (68/120)
回答No.1

定数プールに同じ文字列が存在してもnewした場合は新しいオブジェクトが 作成されるのでstr1、str2、str3は別のオブジェクトになります。 String str1 = "str1"; String str2 = "str1"; String str3 = "str1"; とすればstr1、str2、str3は定数プールの"str1"オブジェクトを 参照することになり"same!"が表示されます。

maiko_asu
質問者

お礼

なるほど!よく分かりました。ありがとうございます(^0^)! no2にもお書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!

maiko_asu
質問者

補足

回答に対するお礼 no2にお書きになられた方は別の方でしたね。。 申し訳ないです。

関連するQ&A

  • JavaのStringの比較について

    お世話になります。 String string1 = new String("あいうえお"); //(1) String string2 = new String("あいうえお"); //(2) String string3 = "あいうえお"; //(3) String string4 = "あいうえお"; //(4) System.out.println(string1 = = string2); //(5) System.out.println(string3 = = string4); //(6) 実行結果 false true (5)がfalseになるのは分かるのですが、(6)がtrueになるのはなぜでしょう?また、(1)や(2)のようなStringオブジェクトの生成方法と(3)や(4)のようなStringオブジェクトの生成方法の違いは何でしょう? よろしくご教授ください。

    • ベストアンサー
    • Java
  • stringのreplace

    import java.io.*; public class ex51c { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.print("String> "); String str= in.readLine(); if(str.equals("")) { break; } String res = ""; res =str.replace('a', '*') returns str.replace('e', '*') returns str.replace('i', '*') returns str.replace('o', '*') returns str.replace ('u', '*'); System.out.println(res); } } } このようなプログラムを作ってみたのですが、 コンパイル時にエラーが出ます。 どこを直せばいいのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • Stringオブジェクトについて

    ある参考書では、Java のメモリー使用効率を改善するために、JVM は「String 定数プール」と呼ばれる特別なメモリー領域を確保していると書いてあり、String を作成する例として次の2つのパターンのコードについて説明している(この例では、定数プール内にほかのString は存在しないものとしている)。 ・パターン(1) String s = "abc"; // 1つのString オブジェクトと         // 1つの参照変数を作成する この例では、"abc" がプールに納められ、変数s がそれを参照する。 ・パターン(2) String s = new String("abc"); // 2つのString オブジェクトと                  // 1つの参照変数を作成する。 このコードでは、new キーワードを使ったので、新しいString オブジェクトが標準の(プールでない)メモリー上に作成され、変数s がそれを参照する。さらに、リテラル"abc" がプールに収められる。  そこで質問ですが、パターン(2) で、変数s と2つのオブジェクトはそれぞれ互いにどのような関係(メモリー上の関係も含めて)を持っているのか。 例えば変数s に対してプリント命令を出したときにJVM はこの2つのオブジェクトに対してどのような処理をするのか。 またこれらのオブジェクトのhashcode はどうなっているのでしょうか。どなたか教えてください。

  • String <=> byte配列 の際のエンコード

    なんで、 String str = "あいうえお"; byte[] temp = str.getBytes("8859_1"); String str2 = new String(temp, "8859_1"); System.out.println(str2); このコードが ????? を出力するかわかる方、おしえてください。

    • ベストアンサー
    • Java
  • コマンドプロンプトでひらがなの入力が出来ません。

    普段グーグル日本語入力を使っています。 OS XPsp2 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは"; String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です"); break; } else if(str2.length() > str.length()){ System.out.println("長すぎます。"); } else if(str2.length() == str.length()){ System.out.println("長さはあっています。"); } else{ System.out.println("短すぎます。"); } } System.out.println("終了"); } }

    • ベストアンサー
    • Java
  • ==演算子について

    ●下記のコードについて質問があります public class AutoboxingTest { public static void main(String args[]) { Integer wi1 = 300; Integer wi2 = 300; int i = 300; if(wi1 == wi2) { System.out.println("wi1 == wi2"); } ----------------------------------------------- if(wi1 == i) { System.out.println("wi1 == i"); } ------------------------------------------------- } } ※書籍に書いてあるコードを引用しています。 質問は「-」の部分になりますが、 wi1とiを比較した結果がtrueになると、書籍では記載されています。 しかし、実際にコンパイルして動作確認したところ、falseとなります。 「==」はオブジェクトの参照が同じであるかを見ており、 w1とiは型が違うため、falseになると思います。 何故、書籍ではtrueになるのかをお伺いしたく掲示板にて記載しました。

    • ベストアンサー
    • Java
  • string...?

    String filename; Image image; /*入力画像ファイルの名前の取得*/ BufferedReader d = new BufferedReader(new InputStreamReader(System.in)); while(true){ System.out.println("Type image file name."); filename = d.readLine(); File file = new File(filename); if(file.exists() == true){ break; }else{ System.out.println("File not found.\n"); } } /*画像の取り込み*/ Toolkit tk = Toolkit.getDefaultToolkit(); image = tk.getImage(filename); . . . という画像の名前を入力してそれがあれば読み込むというプログラムです(激省略)。 コンパイルはできたのですが、実行して名前をいれるとエラーが起きます。 Warning: Cannot convert string "-ryobi-minchol-medium-r-normal--*-140-*-*-c-*-jisx0208.1983-0" to type FontStruct とこんなのが。 解決策をお願いします。 一応環境をいっておくと turbolinux7 bashで実行です。

    • ベストアンサー
    • Java
  • charAt(0)について

    import java.io.*; class Sample3 { public static void main(String[] args) throws IOException { System.out.println("文字列を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("検索文字を入力してください。"); String str2 = br.readLine(); char ch = str2.charAt(0); int num = str1.indexOf(ch); if(num != -1) System.out.println(str1 + "の" + (num+1) + "番目に「" + ch + "」が見つかりました。"); else System.out.println(str1 + "に「" + ch + "」はありません。"); } char ch = str2.charAt(0);の部分ですが、 charAt(0)というのは ( )に書かれている番号「のみ」を参照するんですよね? だからもし「こ」んちにはと入力しても0番目の「こ」しか出さないはずなのに、 「に」 を入れたらちゃんと「3番目に に が見つかりました」と出るのはなぜですか?

    • ベストアンサー
    • Java
  • nullについて

    public class Test0 { public static void main(String[] args) { String str="x"; str=null; if(((Object)str).equals(null)) { System.out.println("ok"); } else { System.out.println("out"); } } } を実行するとエラーになります str=null; をコメントアウトするとエラーでなくなります クラスオブジェクトがnullに等しいかどうか をするときにたとえそのオブジェクトがnullであっても エラーにならないようにするにはどうしたらいいのでしょうか? (tryは使用しない方法でおねがいします) また String x; とした直後にxはnullなのでしょうか? String以外に一般のクラスについてもお願いします

    • ベストアンサー
    • Java
  • String#replaceALL

    をつかって 「俺は~」を「私は~」 に変えたいのですが、 String str = "俺は天才だ。冗談だ"; str.replaceAll("俺", "私"); System.out.println(str.toString()); ではうまく行きません。 正規表現とかよく知らないので教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう