java中包装类的比较用法
java中包装类的比较用法
一、前言
java中 ,包装类是一个对象,也是一个具体的数值。对于对象比较可以用 equals()方法,对于数值的比较可以用 == 进行比较,那么对于包装类该用那种方法比较合适呢?
二、实验代码如下
-
Integer a1=120;
-
Integer b1=120;
-
System.out.println(a1==b1); // true
-
System.out.println(a1.equals(b1)); // true
-
System.out.println("<-------分割线 1----------->");
-
Integer a2=133;
-
Integer b2=133;
-
System.out.println(a2==b2); // false 注意这个结果不一样。
-
System.out.println(a2.equals(b2)); // true
-
System.out.println("<-------分割线 2----------->");
三、原因分析
1、通过实验代码可以看到, a2 == b2 的结果与 a1==b1 结果不一样。
2、 使用java反编译工具,对代码反编译可以看到:( java反编译工具下载)
-
原代码: Integer a1=120;
-
编译后: Integer a1 = Integer.valueOf(120);
说明了,包装类在进行直接赋值的时候,底层调用的是 Integer.valueOf()方法,通过查看JDK源码:
3、可以看到,从jdk1.5开始,Integer提供了一个内部类,IntegerCache , 数值范围在 Integer
(-128 ~ 127)之间(byte 类型的范围 ),是不会新建对象,调用的是数据缓冲池中的值。
四、最终结论
总结: 在byte类型范围内, 包装类用 == 和 equals()方法比较值是一样的,超出byte范围, == 即使数值结果
一样,但是 == 返回的false,因为 Integer 底层新建了对象,不是同一个地址值。
结论: java中包装类请使用 equals()方法进行比较!
转载自:https://blog.****.net/HaHa_Sir/article/details/79040981