人気マンガがだれでも無料♪電子コミック読み放題!!

●下記のコードについて質問があります

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になるのかをお伺いしたく掲示板にて記載しました。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

上記例で wi1 == i を行った場合、次のコードと同等とみなされます。



wi1 == new Integer( i )

この場合、wi1と新しくインスタンスとなったIntegerオブジェクトは別物なので、falseです。

おそらく、 i == wi1 と書かれていればtrueでしょう。
この場合、次のコードと同等となるはずです。

i == wi1.intValue()

これだとプリミティブ型同士の比較になるので、trueになります。

その書籍は今後参考にされないほうがいいかもしれません。

この回答への補足

納得のいく意見で理解をすることができました。
実際に、自分でサンプルを作ってみました。

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

の処理が行なわれているのではと思われます。

基本データ型と参照データ型間で==演算子を使うと、
データの参照先の値を比較するものだと理解しました。

補足日時:2007/07/29 21:49
    • good
    • 0

>両方とも、


>i == wi1.intValue()
>wi1.intValue() == i
>の処理が行なわれているのではと思われます。

実際に逆コンパイルして試してみたら、確かにそのようになっていました。大変失礼しました。

> Stringクラスの比較について

これは、s1とs2は独自にメモリを確保しているから
値は同じですが、値を持つオブジェクトの参照先は違うということになります。
そのため、結果はfalseとなります。

Stringクラスは内部にchar型の配列を持つオブジェクトで、new String(String)した場合は新しいインスタンスをメモリに割り当て、引数のStringオブジェクトにあるchar型の配列の参照を新しいインスタンスにコピーします。
なので、内部で保持しているchar型配列の参照先は同じになりますが、インスタンス自体は全く別物です。
    • good
    • 0

補足です。



「参照の違い」という概念は理解されていますか?

つまり
'wi1 == wi2'がtrueにならないという意味を。

この回答への補足

参照の違いはこの下のスレに記載しています。
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になるのかご教授していただければと思います。

補足日時:2007/07/29 21:05
    • good
    • 0

仰る通り 'wi1 == i' の結果はtrueです。



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

大変失礼しました。
wi1 == iの結果はtrueになります。
書き間違えをしてしまい申し訳ございません。

このスレの上に記載されている

>>wi1 == wi2'がtrueにならないという意味

これは、wi1とwi2は独自にメモリを確保しているから
値は同じですが、値の参照先は違うということになります。
そのため、結果はfalseとなります。

とすると、
wi1 == i

は、wi1やiでも独自のメモリを参照しているので、
falseになるという結果に繋がってしまいます。

まだ、イメージがつかめず苦労しています。

お礼日時:2007/07/29 20:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング