包装类关于拆箱与比较的操作

==与equals()

  • ==
  1. 对于基本数据类型变量利用==来判断他们存储的值是否相同;
  2. 对于引用类型变量,==比较的是他的地址。
  • equals()
  1. 如果没有重写Object中的equals(),那么比较的是对象的地址。
    从源码看出对对象的比较,本质也是用了==

包装类关于拆箱与比较的操作
2. 包装类重写了equals()方法。
如图,以Long类型为例,要参与equals()比较的前提是,被比较对象必须是当前类,或当前类的子类对象(包括当前类型对应的基本数据类型)。否则直接返回false
如果满足条件,(value 是final修饰的long类型成员变量,在new Long对象时予以赋的值。JDK1.5之后有了自动装箱)会先拆箱包装类对象,再按照基本数据类型(该基本数据类型就是value,也就是当前包装类变量所存储的基本类型的值)规则比较。

包装类关于拆箱与比较的操作
同类型包装类和包装类用==比较时,不自动拆箱。如果类型不同,为编译时异常,不能比较。
包装类碰到运算符会自动拆箱,并可能存在类型升级

包装类的缓存问题(多用于==判断)
包装类自动装箱的时候:Byte,Short,Integer,Long都有缓存对象(-128~127),这个范围内的对象,自动装箱值相同时,是指向一个对象。超出了范围则新建对象,存储不同地址。
Character缓存范围:0~127 最早的ASCII码表的128个字符
Boolean:false,true
Float,Double没有缓存对象

例题:

包装类关于拆箱与比较的操作