面试当中遇到过这么一个问题,Integer类型,能通过 > 、 < 号进行比较吗?我印象中是会进行拆箱,然后转换成int进行比较,结果面试官说包装类型没有 > 、 < 方法,是不能直接比较的,现实际验证一下。不考虑null的情况。
代码很简单:
public static void main(String[] args) {
Integer i1 = new Integer(220);
Integer i2 = new Integer(210);
System.out.println(i1 >= i2);
}
编译没有报错,运行结果也是正常的,打印的内容是 true
看一下javap后的主要代码:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=3, args_size=1
0: new #2 // class java/lang/Integer
3: dup
4: sipush 220
7: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
10: astore_1
11: new #2 // class java/lang/Integer
14: dup
15: sipush 210
18: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
21: astore_2
22: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
25: aload_1
26: invokevirtual #5 // Method java/lang/Integer.intValue:()I
29: aload_2
30: invokevirtual #5 // Method java/lang/Integer.intValue:()I
33: if_icmplt 40
36: iconst_1
37: goto 41
40: iconst_0
41: invokevirtual #6 // Method java/io/PrintStream.println:(Z)V
44: return
可以看到,序号26、30 ,执行了Integer的intValue方法,将包装类型转换为基本数据类型,然后将值放入栈顶
33 if_icmplt 比较栈顶两int型数值大小,当结果小于0时跳转
所以,Integer的包装类型,也是可以通过> / < 进行比较的,但是底层还是通过int类型进行比较。
看一下Integer类提供的进行比较的方法 compareTo
private final int value;
public Integer(int value) {
this.value = value;
}
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
其实也是通过转换成int类型进行比较。
看一下compareTo方法编译后的样子:
public static void main(String[] args) {
Integer i1 = new Integer(220);
Integer i2 = new Integer(210);
System.out.println(i1.compareTo(i2));
}
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=3, args_size=1
0: new #2 // class java/lang/Integer
3: dup
4: sipush 220
7: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
10: astore_1
11: new #2 // class java/lang/Integer
14: dup
15: sipush 210
18: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
21: astore_2
22: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
25: aload_1
26: aload_2
27: invokevirtual #5 // Method java/lang/Integer.compareTo:(Ljava/lang/Integer;)I
30: invokevirtual #6 // Method java/io/PrintStream.println:(I)V
33: return
可以看到区别:
compareTo方法的返回值是int类型,小于返回-1,等于返回0,其他返回1。
直接比较大小,返回的是布尔类型,结果是true或者fasle。