如果我们开LinkedList并存入Double类型的数值,即使我们存入的数值一样,直接来比较这两个数值的大小也会报错
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
LinkedList<Double> ll1=new LinkedList<>();
ll1.add(1.0);
ll1.add(1.0);
if(ll1.get(0)==ll1.get(1)) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
}
}
而在使用>=或者<=或者<或者>时则会成功,
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
LinkedList<Double> ll1=new LinkedList<>();
ll1.add(1.0);
ll1.add(1.0);
if(ll1.get(0)>=ll1.get(1)) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
}
}
这是为什么呢,这就涉及到Java的自动拆箱原理和==号的比较原理
先说==号的比较原理吧,在比较基本数据类型时,他比较的是基本数据类型的数值大小,但是引用数据类型时就是比较的数据的地址大小,
自动拆箱原理是Java的自动拆箱功能可以自动将一个对象类型转换成对应的基本类型。例如,从 Double
到 double
。这主要用于算术运算和比较运算(如 <
, >
, <=
, >=
),因为这些操作符是为基本类型设计的。虽然自动拆箱会在需要时将 Double
转换为 double
,但是等号 ==
用于对象比较时不触发自动拆箱。这是因为 ==
用于对象时其语义就是比较引用,而不是比较值。自动拆箱适用于需要数值比较的情况,如使用比较运算符 <
, >
, 或者在算术运算中。
所以以后在计算存入队列中的数值大小时有三种方法
第一:(不推荐)
将ll1.get(0)==ll1.get(1)改为ll1.get(0)-ll1.get(1)==0
这涉及到自动拆箱原理,但是容易混淆
第二:(推荐)
equals方法比较两个数值是否一样,
第三(推荐)
将数值优先转化为基本数据类型,再比较: