今回は==とequalsメソッドについて調べました。

public static void main(String[] args) {
    ArrayList ListA = new ArrayList(); 
    ArrayList ListB = new ArrayList();
    ArrayList ListC = ListA;

    ListA.add("abc");
    ListB.add("abc");

    System.out.println("ListAとListCは" + (ListA.equals(ListC) ));
    System.out.println("ListAとListBは" + (ListA.equals(ListB) ));
    System.out.println("ListAとListCは" + (ListA==ListC )); 
    System.out.println("ListAとListBは" + (ListA==ListB ));
    System.out.println("ListAは" + (ListA==new ArrayList() ));

    System.out.println("ListAの中身とListBの中身は" + (ListA.toString().equals(ListB.toString()) ));
    System.out.println("ListAの中身とListBの中身は" + (ListA.toString()==ListB.toString()) );
    System.out.println("ListAの中身とListCの中身は" + (ListA.toString().equals(ListC.toString()) ));
    System.out.println("ListAの中身とListCの中身は" + (ListA.toString()==ListC.toString()) );
    System.out.println("ListAの中身は" + (ListA.toString()=="abc") );
    System.out.println("ListAの中身は" + (ListA.toString().equals("abc")) );

    System.out.println(ListA.toString());
}

結果は

ListAとListCはtrue
ListAとListBはtrue
ListAとListCはtrue
ListAとListBはfalse
ListAはfalse
ListAの中身とListBの中身はtrue
ListAの中身とListBの中身はfalse
ListAの中身とListCの中身はtrue
ListAの中身とListCの中身はfalse
ListAの中身はfalse
ListAの中身はfalse
[abc]

でした。オブジェクトを比較する際に==を使うのはかなり注意が必要です。==は同じメモリ領域かどうかまで判定するからです。

中身だけ比較したい場合は、equalsメソッドを使います。このメソッドは格納されているオブジェクトが同じかどうかだけ判定し、メモリ領域は関係しません。

今回面白かったのは、System.out.println (“ListAの中身とListCの中身は” + (ListA.toString()==ListC.toString()) ); で、

falseが返ってくることでした。ListAとListCは同じメモリ領域であったのに、格納した文字列のメモリ領域は別々なんですね。

次回から就業規則ネタでいきたいと思います。とりあえず、決めてほしい社員の労働条件を書いておいたのでコメント下さい。

カテゴリー: 技術情報

2件のコメント

koreyasu · 2007-06-28 15:06

一部修正しておきました。

> ListAとListCは同じメモリ領域であったのに、格納した文字列のメモリ領域は別々

もう少し深い考察を望みます。格納した文字列のメモリ領域が異なるのでしょうか?

ojarz · 2007-07-04 10:34

☆労働条件☆
1.フレックスタイム制
 コアタイム 7:30~8:00 及び 12:00~1:00 及び 18:00~19:00
 食事は皆で食べましょう

2.親睦タイム制
 19:00~20:00 皆でボードゲーム 優勝者はボーナス査定UP

このくらいかな。

現在コメントは受け付けていません。