2

メソッドをオーバーライドするクラスを拡張し、equals()誰かがサブクラスに新しいアスペクトを追加したときにそれを「保存」しておくことはできないことを私は知っています。クラスPointとそのサブクラスを使用した一般的な例は、それを示しています。

public class Point {

    Double d1;
    Double d2;

    public Point(double d1, double d2){
        this.d1 = d1;
        this.d2 = d2;
    }
}

public class ColorPoint extends Point {

    String color;

    public ColorPoint(double d1, double d2, String s) {
        super(d1, d2);
        color = s;
    }
}

equals()メソッドとを作成する Eclipse がhashCode()ある場合、 の場合は color 属性も考慮されますColorPoint。したがって、このequals()方法は対称的ではないことが証明されます。コード:

Point p1 = new Point(2,2);
ColorPoint cp1 = new ColorPoint(2, 2, "blue");

System.out.println(p1.equals(cp1));
System.out.println(cp1.equals(p1));

プリント:

真/偽

同様に、この方法が推移的でないことも証明できます。ただし、オブジェクトを a のキーとして渡すHasMapと、渡す順序に関係なく、オブジェクトが異なるものとして認識されます。コード:

Point p1 = new Point(2,2);
Point p2 = new Point(3.1,3.1);
ColorPoint cp1 = new ColorPoint(2, 2, "blue");
ColorPoint cp2 = new ColorPoint(3.1,3.1, "red");


Map<Point, Integer> map = new HashMap<>();
map.put(cp2, 4); map.put(cp1, 3);
map.put(p1, 1); map.put(p2, 2); 

System.out.println(map.size());

オブジェクトを別の順序で渡しても、常に4が出力されます。それは期待されていますか?Mapでは、キーを比較するためにはどの方法を使用しますか?

4

1 に答える 1