• ベストアンサー

==演算子について

●下記のコードについて質問があります 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になるのかをお伺いしたく掲示板にて記載しました。

  • KGM
  • お礼率44% (66/148)
  • Java
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

上記例で wi1 == i を行った場合、次のコードと同等とみなされます。 wi1 == new Integer( i ) この場合、wi1と新しくインスタンスとなったIntegerオブジェクトは別物なので、falseです。 おそらく、 i == wi1 と書かれていればtrueでしょう。 この場合、次のコードと同等となるはずです。 i == wi1.intValue() これだとプリミティブ型同士の比較になるので、trueになります。 その書籍は今後参考にされないほうがいいかもしれません。

KGM
質問者

補足

納得のいく意見で理解をすることができました。 実際に、自分でサンプルを作ってみました。 public class AutoboxingTest { public static void main(String args[]) { Integer wi1 = 300; Integer wi2 = 300; int i = 300; if(wi1==i) { System.out.println("wi1==i"); } if(i==wi1) { System.out.println("i==wi1"); } } } wi1==iとi==wi1で確認したところ、両方ともtrueになってしまいました。 >上記例で wi1 == i を行った場合、次のコードと同等とみなされます。 >wi1 == new Integer( i ) >この場合、wi1と新しくインスタンスとなったIntegerオブジェクトは >別物なので、falseです。。 両方とも、 i == wi1.intValue() wi1.intValue() == i の処理が行なわれているのではと思われます。 基本データ型と参照データ型間で==演算子を使うと、 データの参照先の値を比較するものだと理解しました。

その他の回答 (3)

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.4

>両方とも、 >i == wi1.intValue() >wi1.intValue() == i >の処理が行なわれているのではと思われます。 実際に逆コンパイルして試してみたら、確かにそのようになっていました。大変失礼しました。 > Stringクラスの比較について これは、s1とs2は独自にメモリを確保しているから 値は同じですが、値を持つオブジェクトの参照先は違うということになります。 そのため、結果はfalseとなります。 Stringクラスは内部にchar型の配列を持つオブジェクトで、new String(String)した場合は新しいインスタンスをメモリに割り当て、引数のStringオブジェクトにあるchar型の配列の参照を新しいインスタンスにコピーします。 なので、内部で保持しているchar型配列の参照先は同じになりますが、インスタンス自体は全く別物です。

  • momozange
  • ベストアンサー率67% (21/31)
回答No.2

補足です。 「参照の違い」という概念は理解されていますか? つまり 'wi1 == wi2'がtrueにならないという意味を。

KGM
質問者

補足

参照の違いはこの下のスレに記載しています。 String型の==演算子で確認したいことがあります。 public class refer { public static void main(String args[]) { String s1 = new String("Hello"); String s2 = "Hello"; System.out.println(s1==s2); /*(1)*/ System.out.println(s1.equals(s2)); /*(2)*/ } } (1)はオブジェクトの参照を比較 (2)はオブジェクトの参照の値を比較 しています。 ここで、(1)の結果になりますが、falseになります。 String s2 = "Hello"; を呼び出すと、コンストラクタに指定されている文字が s1と同一であり、s2はnew演算子を使っていないので、 参照先は同じになると思われます。 何故、falseになるのかご教授していただければと思います。

  • momozange
  • ベストアンサー率67% (21/31)
回答No.1

仰る通り 'wi1 == i' の結果はtrueです。 Integerであろうとintであろうと変数を宣言するという行為でJVM内に4byte分のアドレスが確保されるわけです。 今回の場合4byte範囲の数値がメモリの「どこか」に[00 00 01 2C」として確保されることになります。 宣言後、次回からはこれをロードできるようになるわけですから参照としては「同じもの」ということになり 条件文の結果はtrueです。

KGM
質問者

お礼

大変失礼しました。 wi1 == iの結果はtrueになります。 書き間違えをしてしまい申し訳ございません。 このスレの上に記載されている >>wi1 == wi2'がtrueにならないという意味 これは、wi1とwi2は独自にメモリを確保しているから 値は同じですが、値の参照先は違うということになります。 そのため、結果はfalseとなります。 とすると、 wi1 == i は、wi1やiでも独自のメモリを参照しているので、 falseになるという結果に繋がってしまいます。 まだ、イメージがつかめず苦労しています。

関連するQ&A

  • 書き換え

    以下のソースコード(*を使って二等辺三角形を表示するプログラム)をwhile文のかわりにdo-while文を使って書き換える方法が分かる方ぜひ教えてください。いろいろ試しましたがコンパイルできずに困っています↓ //Triangle2.java class Triangle2{ public static void main(String args[]){ try{ if(args.length !=1){ System.out.println("Please input single positive integer!"); } else if(Integer.parseInt(args[0])>0) { int n = Integer.parseInt(args[0]); int i=0; while(i < n){ int j=0; while (j <= i){ System.out.print("*"); j++; } System.out.println(); i++; } int m=n-1; while(m > 0){ int k=m; while(k > 0){ System.out.print("*"); k --; } System.out.println(); m --; } } else{ System.out.println("Please input single positive integer!"); } }catch(NumberFormatException e){ System.out.println("Please input single positive integer!"); } } }

  • intではなくStringで・・・

    こんなソースがあります。。 public class Check { public static void main(String[] args) { int i = Integer.parseInt(args[0]); if (i == 123) { System.out.println("あたり!"); } else if (i < 123) { System.out.println("はずれ!"); } else { System.out.println("おおはずれ!"); } } } これを、int型の文字を入力して判定させるのではなく、String型の文字で判定させたいのですが、 int i = Integer.parseInt(args[0]);をどう変えればいけるでしょうか? よろしくお願いします!

    • ベストアンサー
    • Java
  • javaプログラミングの質問です。

    プログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } }

    • ベストアンサー
    • Java
  • プログラムの平均値の出し方。

    プログラムの平均値の出し方。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } } このプログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。

  • 研修生です。

    class dentaku{ public static void main(String args[]){ int val1 = 0; int val2 = 0; String ope; int kekka; if (args.length != 3){ System.out.println("引数は3個入力して下さい"); System.exit(0); } try{ val1 = Integer.parseInt(args[0]); val2 = Integer.parseInt(args[2]); }catch(NumberFormatException e){ System.out.println("数値でない値が入力されています"); System.exit(0); } ope = args[1]; String opeStr[] = {"kake", "waru", "tasu", "hiku"}; boolean errFlag = true; for (int i = 0 ; i < 4 ; i++){ if (ope.equals(opeStr[i])){ errFlag = false; } } if (errFlag == true){ System.out.println("演算子は kake waru tasu hiku の4つです"); System.exit(0); } if (ope.equals("kake")){ kekka = val1 * val2; }else if (ope.equals("tasu")){ kekka = val1 + val2; }else if (ope.equals("hiku")){ kekka = val1 - val2; }else{ if (val2 == 0){ System.out.println("0で割ろうとしています。"); System.exit(0); } kekka = val1 / val2; } System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です"); System.out.println("計算結果は " + kekka + " です"); } }  上記のプログラムを全行網羅するために、引数のパターンを洗い出して表にしたいのです。 どうすればいいのですか?

  • Java subSetメソッドについて

    連投になってしまい申しわけございません。 ocj-p目前でハッキリしない問題を詰めております。 subSetメソッドについて、2冊の書籍を調べたのですが 解説がどちらも違っていてハッキリしません。 例えば以下のコードについて public class A { public static void main(String[] args) { TreeSet<Integer> ts1 = new TreeSet<Integer>(); TreeSet<Integer> ts2 = new TreeSet<Integer>(); for(int i=106; i<113; i++) { if(i%2 == 0) ts1.add(i); } ts2 = (TreeSet)ts1.subSet(108, true, 111, true); ts1.add(129); System.out.println(ts1 + "" + ts2); } } 1冊目では参照型ではないという考え方でaddはts2には反映せず [106, 108, 110, 112, 129][108, 110] 2冊目では参照型であるためaddは相互には反映し [106, 108, 110, 112, 129][108, 110, 129] とあります。 どちらの考え方が正しいでしょうか? 私はずっと参照型ではない=1冊目と同じ考え方でした。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • boolean型

    class Bool {   static boolean b;   public static void main(String [] args) {     int x=0;     if (b ) {       x=1;     }     else if (b = false){       x=2;     }     else if (b){       x=3;     }     else {       x=4;     }     System.out.println("x = " + x);     System.out.println(b=false);   } } SUNのサイトにあった「どのような結果になるか」と言う問題なのですが、8行目の if(b=false) の部分がifの括弧の中はBoolean型じゃないといけないのに 代入してるからコンパイルエラーだなとおもったのですが あっさりコンパイルは通ってx=4と言う出力です・・・ (b=false) と言うのはどのようにコンパイルされているのですか?? なぜ 代入が、BooleanとしてOKなのでしょうか??

    • ベストアンサー
    • Java
  • java 素数判定

    入力した数字が整数か否かを判定するjavaプログラムを作っています。 以下の通りコンパイルして実行しました。これだと実行したときに どんな数字を数字を入力しても「31は素数です。 」となります。 入力した数字を判定させるにはどのようにしたらいいのでしょうか? class Sosuu { public static void main (String[] args) { int n = 31; boolean isPrime = true; for (int i = 2; i <= n - 1; i++) if (n % i == 0) { isPrime = false; break; } if (isPrime) System.out.println(n + " は素数です。"); else System.out.println(n + " は素数ではありません。"); } }

    • ベストアンサー
    • Java
  • Javaプログラムの間違いを見つけてください

    下記のプログラムをマニュアル通りに入力したのですが、おそらくマニュアルにミスがあったのでしょう。どこが間違っているのか教えてください。よろしくお願いしますm_ _m class kadai1710 { public static void main (String args []) { System.out.println(args[0]); if(Integer.parselnt(args[0]) == 1) System.out.println("男性"); else System.out.println("女性"); } }

    • ベストアンサー
    • Java
  • Integer クラスについて教えて下さい

     今晩は、java初心者です、宜しくお願いします。    Integerクラスについて下のように「i1 = new Integer("1");」と書いても「i2 = new Integer(1);」 と書いても、どちらも数字として認識されているようです。  正式な書き方としてはどちらなんでしょうか、宜しくお願いします。 ========================================================================= public class Test1 { public static void main(String[] args) { Integer i1 = new Integer("1"); System.out.println((i1+2)); Integer i2 = new Integer(1); System.out.println((i2+3)); } }

    • ベストアンサー
    • Java

専門家に質問してみよう