2012年3月31日土曜日

【Java】オブジェクトの比較

前回は条件文と演算子について書きましたが、その中で値の比較を行っていました。
if (num == 0) { } // 変数宣言は省略
みたいなのです。
numと0が等しいかどうかを比較しています。

それでは文字列を扱うString型の比較はどうでしょうか?
String zero = "0";
if (zero == 0) { } // TRUEを返す
これはTRUEとなります。
では次のはどうでしょう?
String zero = "0";
String zeroNew = new String("0");
if (zero == zeroNew) { } // FALSEを返す
これはFALSEとなります。
参照型の場合はプリミティブ型の場合と異なり、
値そのものでなくオブジェクトの比較が行われます。
この場合、newされたzeroNewが指す"0"を格納したアドレスは
zeroのものとは違うアドレス(それこそ新しいアドレス)のため、FALSEとなります。

以前説明に使用したジョブクラスを使用して説明してみます。
シーフ siroco = new シーフ(); // シーフクラスのsirocoインスタンスを生成
シーフ kururu = new シーフ(); // シーフクラスのkururuインスタンスを生成

if (siroco == kururu ) { } // FALSEを返す
この方がわかりやすいんじゃないでしょうか?
同じシーフクラスのインスタンスでも、sirocoとkururuは別人ですもんね。

それではオブジェクトが指している"値"を比較するにはどうしたらいいでしょうか?
それはObjectクラスのメソッド、equalsを使用します。
String zero = "0";
String zeroNew = new String("0");
if (zero.equals(zeroNew)) { } // TRUEを返す
この例ではString型のzeroインスタンスのequalsメソッドを使用して、
 同じくString型のzeroNewインスタンスとの比較を行っています。
(参照型のクラスはすべてObjectクラスを継承しているため、equalsを使う事が出来る)
equalsなら別インスタンスでも値の比較ができ、求めている結果が得られます。

文字列の比較は結構やると思いますので、
くれぐれも"=="で比較しないように~

今回は以上です。
次回は繰り返し処理について書いていきます。

0 件のコメント:

コメントを投稿