比较Double类型的对象时出错?

时间:2013-08-26 04:31:17

标签: java double

这个问题出现在这段代码之后(二进制搜索的实现)。如果有人能告诉我为什么没有输出预期答案,我将不胜感激:

public static void main(String[] args){
    Double[] array = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
    BinarySearch s = new BinarySearch(array);
    System.out.println(s.searchNextHighest(2.0));
}

public BinarySearch(Double[] array){
    numbers = array;
}

public Integer searchNextHighest(Double y){
    return binarySearchNextHighest(0, numbers.length-1, y, numbers);
}

public Integer binarySearchNextHighest(int min, int max, Double target, Double[] array){
    int mid = (min+max)/2;

    if(target==array[mid]){ //Fails here
        return mid;
    }

    if(max<min){
        if(min>=array.length) return null;
        return mid;
    }

    if(target>array[mid]){
        return binarySearchNextHighest(mid+1, max, target, array);
    }else{
        return binarySearchNextHighest(min, mid-1, target, array);
    }
}

输出:     1

我通过了一个调试器,并且绝对肯定。在某个时刻,target = 2.0,mid = 2,array [mid] = 2.0。然而,if语句没有执行。

奇怪的是,使用整数数组/目标时不会发生此错误。

这里发生了什么?我认为这些事情只发生在比较非常大的数字时。还有哪些陷阱?

[编辑]这是一个简化版本:

public static void main(String[] args){
    Double[] array = {2.0};
    Double target = 2.0;
    if(array[0] == target) System.out.println("Yay!");
}

输出:无

[EDIT2]

public static void main(String[] args){
    double[] array = {3.0};
    double target = 3.0;
    if(array[0] == target) System.out.println("Yay!");
}

输出:耶!

评论中有人指出此错误是比较对象的结果。为什么不自动拆包?

[EDIT3]以下是使用Integer对象的代码:

public static void main(String[] args){
    Integer[] array = {3};
    Integer target = 3;
    if(array[0] == target) System.out.println("Yay!");
}

输出:耶!

所以我猜原因很明显,但为什么Integer对象的实现方式却如此不同?这会自动解压缩。

2 个答案:

答案 0 :(得分:6)

doubleDouble是两回事。 Double创建一个对象,如果它们指向内存中的相同地址,它们将是相等的。它们所持有的值可以相同,但它们是不同的对象,因此不相等。与Integer相同。对于您的代码,您可以使用double代替,或者通过.doubleValue().equals()方法比较Double来比较这些值。

编辑:正如@MarkPeters和@TedHopp在评论中指出的那样,Integer的行为略有不同,更多信息here

答案 1 :(得分:3)

使用equals()方法比较两个对象的内容。

 if(target.equals(array[mid])){
    return mid;
}  

根据Double#equals

  

将此对象与指定对象进行比较。当且仅当参数不为null并且是一个Double对象,表示与该对象表示的double具有相同值的double时,结果为true。

请同时查看What's the difference between ".equals" and "=="?