== vs equals双打方法

时间:2016-04-13 17:30:39

标签: java

我有这个班级

public class Point {
    private Double[] coordinates;
    private int dimension;

    public Point(Double[] coordinates) {
        dimension = coordinates.length;
        this.coordinates = new Double[dimension];

        for(int i = 0; i < dimension; i++)
            this.coordinates[i] = coordinates[i];


    }

    public Double getCoord(int n) {
        if(n < 0 || n > dimension -1 ){
            throw new RuntimeException("error de coordenadas");
        }
        return coordinates[n];
    }
    public int getDim() {
        return dimension;
    }

    public boolean equals(Object p1){
        if( (p1 instanceof Point) ){
            Point p = (Point) p1;
            int n = p.getDim();
            if(getDim() == n)
            {
                for(; n > 0; n--)
                {
                    if( Double.valueOf(this.getCoord(n-1)) != Double.valueOf(p.getCoord(n-1)) ) // <------- BAD LINE!
                    {
                        System.out.println("Checking coord " + (n-1));
                        System.out.println("Coord " + (n-1) + " p = " + Double.valueOf(this.getCoord(n-1)));
                        System.out.println("Coord " + (n-1) + " p2 = " + Double.valueOf(p.getCoord(n-1)));
                        return false;
                    }
                }
            }
            return true;
        }
        return false;
    }
}

这个主要的

public class FigureTest {
    public static void main(String[] args){
        Double[] coord1 = {2.0,3.3};
        Double[] coord2 = {2.0,3.3};
        Point p = new Point(coord1);
        Point q = new Point(coord2);
        System.out.println(p.equals(q));
    }
}

我无法理解为什么这个p.equals(q)返回false!它进入if( Double.valueOf(...但是然后打印出两个坐标相等。如果删除Double.valueOf,则相同。它工作的唯一方法是我放! if(this.getCoord(n-1).equal(p.getCoord(n-1)),但我不明白为什么其他人不工作。

2 个答案:

答案 0 :(得分:4)

<div id="container"> <div id="buttonContainer"> <span id="button">&#128339;</span> <span id="title">History</span> </div> </div>会返回Double.valueOf 对象不是原始对象

您执行参考检查(Double)。因此,即使!=为两个调用返回相同的数值,不同的对象也将包装数字,因此!=检查将为真,导致您的等于返回false。

这是一个简单的例子:

Double.valueOf(getCoords(n-1))

注意它是如何返回public static void main(String[] args){ System.out.println(Double.valueOf(5) == Double.valueOf(5)); } 的。这是因为false是参考检查,每次调用==时都会返回不同的对象。所以当你这样做时

Double.valueOf

该检查将返回true,因为Double.valueOf(...) != Double.valueOf(...) 调用没有返回相同的对象。这就是为什么检查代码会返回valueOf,导致true返回equals

要解决此问题,您可以......

将您的false支票更改为!=支票,该支票会比较数值而不是参考号。

.equals

如果两者共享相同的数值,则返回Double.valueOf(...).equals(Double.valueOf(...));

或者您可以在致电true时使用doubleValue()

getCoord

这样可以避免过多地创建getCoord(n-1).doubleValue() != other.getCoord(n-1).doubleValue() 个对象。

答案 1 :(得分:-3)

为了这个工作;:

p.equals(q)

你需要保持Hashcode和equals之间的契约,并在equals类中hashcodePoint覆盖正确这两者,当我写得正确我的意思是这个:

如果你不知道为什么或者你不需要它,请参考这个question

Double.valueOf(this.getCoord(n-1)) != Double.valueOf(p.getCoord(n-1))

如果班级Point的成员是双打的,那么当您将这些双打作为标准来判断是否p1.equals(p2)

时,你是对的

但根据documentation of the class Double,必须使用静态方法Double.compare(this.getCoord(n-1)),p.getCoord(n-1)才能比较2个双打内容。

因此我建议在equals方法中使用与此类似的方法

if( Double.compare(this.getCoord(n-1)),p.getCoord(n-1)!=0) )