所有整数型包装类对象值的比较,使用equals方法进行比较

一、整数型包装类对象值的比较,使用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);

-————————————————————————————————————– 人生很长,一秒太短,一个月不长不短刚刚好! 加油少年! ———LeaningBD