基本数据类型只有数值,而装箱类型则具有与他们的值不同的同一性.换个说法,两个装箱类型可以具有相同的值和不同的同一性.
案例:
回想比较器compare方法返回值是负数,0,还是整数,要取决于它的第一个参数是小于,等于,大于第二个参数.
<script src="https://code.csdn.net/snippets/730317.js"></script>
上面案例,被设计用来表示Integer值的递增数字序列.
严重的缺陷就是naturalOrder.compare(new Integer(2), new Integer(2)),预期效果是0,实际却返回1.,表明第一个数值大于第二个数值.
问题出自何处呢?问题分析.
1.naturalOrder,对表达式first < second执行的是拆箱操作,提取基本数据进行比较,如果答案不成立,进行后续操作.
2.执行计算表达式first ==second,在对象引用的同一性上进行比价,如果first和second引用表示同一个int值,不同内存地址的Integer实例,操作就会返回false,表示第1个值,大于第2个值.
对基本数据类型的包装类型运用 == 操作符总是错误的行为.
<script src="https://code.csdn.net/snippets/730318.js"></script>
那么如何解决这个问题呢?
根本思路不进行同一性比较,即只进行数值比较,不进行对象之间的地址比较.