java中包装类的比较用法

java中包装类的比较用法

 

一、前言

java中 ,包装类是一个对象,也是一个具体的数值。对于对象比较可以用 equals()方法,对于数值的比较可以用 == 进行比较,那么对于包装类该用那种方法比较合适呢?

 

 

二、实验代码如下

 
  1. Integer a1=120;

  2. Integer b1=120;

  3. System.out.println(a1==b1); // true

  4. System.out.println(a1.equals(b1)); // true

  5. System.out.println("<-------分割线 1----------->");

  6.  
  7. Integer a2=133;

  8. Integer b2=133;

  9. System.out.println(a2==b2); // false 注意这个结果不一样。

  10. System.out.println(a2.equals(b2)); // true

  11. System.out.println("<-------分割线 2----------->");

 

三、原因分析

1、通过实验代码可以看到, a2 == b2 的结果与 a1==b1 结果不一样。

 2、 使用java反编译工具,对代码反编译可以看到:( java反编译工具下载

 
  1. 原代码: Integer a1=120;

  2. 编译后: Integer a1 = Integer.valueOf(120);

说明了,包装类在进行直接赋值的时候,底层调用的是 Integer.valueOf()方法,通过查看JDK源码:

 

java中包装类的比较用法

 

java中包装类的比较用法

3、可以看到,从jdk1.5开始,Integer提供了一个内部类,IntegerCache , 数值范围在 Integer 
(-128 ~ 127)之间(byte 类型的范围 ),是不会新建对象,调用的是数据缓冲池中的值。

 

四、最终结论

 

总结: 在byte类型范围内, 包装类用 == 和 equals()方法比较值是一样的,超出byte范围, == 即使数值结果

一样,但是 == 返回的false,因为 Integer 底层新建了对象,不是同一个地址值。

 

结论: java中包装类请使用 equals()方法进行比较!

 

 

转载自:https://blog.****.net/HaHa_Sir/article/details/79040981