一、整数型包装类对象值的比较,使用equals方法进行比较
题眼:整型包装类、值的比较
注:== :对于基本类型,比较的是值;对于引用类型,比较的是地址值。
// 组一
Integer i1=new Integer(10); Integer i2=10; // Integer.valueOf(10) i1==i2;// false
//组二
Integer i3=127; Integer i4=127; i3==i4;// true
// 组三 Integer i5=128; Integer i6=128; i5==i6;// false
组一:
new,会在堆内存中生成一个对象并返回地址值,i2是自动封箱,也new了一个对象,故i1和i2是不同的对象。
组二与组三:
i 的范围为区间[-128,127]时,valueOf方法直接返回事先创建好的对象并返回(复用已有对象),否则根据参数 i在堆上 new一个新的Integer对象并返回。
所以当比较两对象值的话,在[-128,127]时可以直接使用==,当超过这个范围使用equals方法。
推荐全部使用equals方法判断两个对象值是否相等。
二、以此类推:
Short,Long,Integer也类似,但Byte的取值范围是[-128,127],所以直接使用==。
三、扩展:BigDecimal
1)BigDecimal的等值比较应该使用compareTo(),而不是equals()。
答:因为equals()会比较精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度。
说明:在金融项目中,对于精度是非常敏感的,而float 还是double即使浮点数,但是计算机不能完全用二进制表示十进制时候(会出现没有相同的二进制数情况),浮点数会失去一定的精确度。而BigDecimal可以对超过16位有效位的数进行精确的运算。
2)禁止使用BigDecimal(double),存在进度损失风险。
反例:如BigDecimal g = new BigDecimal(0.1F),实际存储值为0.10000000149。
正例:优先推荐使用入参为String的构造方法,或使用BigDecimal的valueOf方法。
BigDecimal bg1 = new BigDecimal("0.1"); BigDecimal bg2 = BigDecimal.valueOf(0.1);