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;
}