コンテンツへスキップ

==とequals

今回は==と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は同じメモリ領域であったのに、格納した文字列のメモリ領域は別々なんですね。

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

© 2003 Kurusugawa Computer Inc.