基础类型和基础类型比较
基础类型和基础类型比较使用==,直接比较值
包装类型比较
- 使用==比较,则比较的是引用指向的地址
- 使用equals()方法比较,则比较的是他的值
基础类型和包装类型比较
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b);//false 引用指向的地址不一样
System.out.println(a.equals(b));//true 比较基本数据类型的值
Integer c = 10;
Integer d = 10;
System.out.println(c == d);//true 引用指向的地址相同 自动装箱的Integer进行了缓存,[-128,127]进行了缓存
System.out.println(c.equals(d));//true 基本数据类型的值是相同的
int e = 10;
System.out.println(e == c);//true int和Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true
System.out.println(c.equals(e));// true Integer使用equals 传入 int,会先装箱成Integer 再使用equals()进行比较
使用javap -c 反汇编命令查看基础类型和包装类型进行比较的过程
99: invokevirtual #8 // Method java/lang/Integer.intValue:()I 调用intValue获取包装类型的基础类型
102: if_icmpne 109
105: iconst_1
106: goto 110
109: iconst_0
110: invokevirtual #5 // Method java/io/PrintStream.println:(Z)V
113: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
116: aload_3
117: iload 5
119: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 调用Integer.valueOf()方法对基础数据类型进行装箱,再传入equals方法里
122: invokevirtual #6 // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
125: invokevirtual #5 // Method java/io/PrintStream.println:(Z)V