3

我有以下简单的 Rectangle 类。如果两个矩形具有相同的高度和宽度,则它们相等并且具有相同的哈希码。我向 hashSet 添加了一个新矩形。

Set<Rectangle> set = new HashSet<Rectangle>();
set.add(new Rectangle(3,3));

当我尝试在具有相同高度和宽度的新矩形上调用 contains 时,它返回 false。

set.contains(new Rectangle(3,3))返回假。我不知道为什么。有任何想法吗?

   public class Rectangle implements Comparable<Rectangle> {
            final int height, width, area, minimumEdge, maximumEdge;

            public Rectangle(int height, int width) {
                this.height = height;
                this.width = width;
                area = height * width;
                maximumEdge = height > width ? height : width;
                minimumEdge = height < width ? height : width;
            }

            public int compareTo(Rectangle rect2) {
                if (rect2.minimumEdge > this.minimumEdge) {
                    return -1;
                } else if (rect2.minimumEdge < this.minimumEdge) {
                    return 1;
                } else {
                    return 0;
                }
            }

            public int hashCode(){
                return ((width + height)*31);
            }

            public boolean equals(Rectangle rect2){
                return (this.height == rect2.height && this.width == rect2.width);
            }
        }
4

2 回答 2

14

你实际上并没有覆盖equals().

您创建了一个新equals(Rectangle)方法,它与虚拟方法无关equals(Object)

这就是为什么@Override在尝试覆盖方法时应该始终添加。

于 2013-09-01T03:50:49.123 回答
3

这里:

public boolean equals(Rectangle rect2){
            return (this.height == rect2.height && this.width == rect2.width);
        }

您制作自己的 equals 方法,而不是覆盖超类方法。

你必须这样写:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Rectangle rect2 = (Rectangle) obj;
    return (this.height == rect2.height && this.width == rect2.width);
}
于 2013-09-01T04:03:58.020 回答