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

Java 比较Double类型的对象时出错?,java,double,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 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);
    }
}
输出:无

[编辑二]

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!");
}
输出:耶

所以我想原因很明显,但是为什么对象整数的实现如此不同呢?自动解包。

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

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

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


还请注意,双重和双重是两种不同的东西
Double
创建一个对象,如果它们指向内存中的同一地址,则它们将相等。它们所持有的值可以相同,但它们是不同的对象,因此不相等。与
整数
相同。对于您的代码,您可以使用
double
,或者通过
.doubleValue()
.equals()
方法对
double
进行比较


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

请参见:@TedHopp两个双打不是可以比较的吗?“我认为这是一个问题,因为他在比较对象。”萨什凯洛——的确如此。这就是问题所在。你应该发布一个关于它的答案。我将更改问题标题,使其与我真正的问题相关。但它实际上适用于整数。我得到了正确的输出。有什么不同的原因吗?@user2316667:这是JVM的细微差别。缓存从-128到127(最小值;允许更大范围)的整数,这样,如果将该范围内的
int
自动装箱为
整数,它将使用共享实例。看见尝试使用大的数字,例如超过1000000
@user2316667-整数缓存一系列较小的int值,因此当您再次使用autobox 2和autobox 2时,您会得到相同的对象。这不会发生在双倍的
上;每次你都会得到一个新的对象。我想如果你比较整数和整数,它会起作用。我不确定整数和整数。。。
 if(target.equals(array[mid])){
    return mid;
}