这两天在开发中遇到了两个比较经典的问题,虽然都是基础的东西,但越是基础的我们有时反而没有把它弄清楚,值得记一下:
#####1、使用==比较Integer的误区
对于Integer平时经常用算是十分熟悉了,但是比较两个Integer的大小是不能用==的,Integer是对象类型,特殊情况是当数值在-128到127之间时是可以进行比较的,原因是java为了提升性能和节省内存,好像是JDK在1.5版本中把-128到127之间的数字做了缓存,在这范围内的数值如果使用Integer.valueOf()方法的话自动装箱都是从缓存中获取的,返回的是同一个数字,但是如果是调用new Integer()的话是不会从缓存中取的,还有就是如果超过边界的话同样也是不等的。
@Test
public void testInteger() {
Integer a127 = 127;
Integer b127 = 127;
Integer a128 = 128;
Integer b128 = 128;
System.out.println("a127 == b127 -> " + (a127 == b127)); //结果返回 true
System.out.println("a128 == b128 -> " + (a128 == b128)); //结果返回 false
}
与Integet联系最近的是int,int作为java的原始数据类型之一,其封装类正是Integer,需要补充一点的是当int和Integer比较时,是不会出问题的,因为Integer会自动拆箱为int,相当于int和int作比较。
#####2、两个、多个double类型求和问题
当使用double类型进行运算时会发生精度丢失的问题,这也是一个基础常见却容易被忽视的问题。先看例子
@Test
public void testDouble(){
double a = 1.13;
double b = 1.14;
System.out.println(a+b); //结果是2.2699999999999996
System.out.println(a+a); //结果是2.26
System.out.println(b+b); //结果是2.28
}
原因是因为double数值在求和或做减法的时候,需要将数值转换为二进制的数值,在转换过程中,存储小数部分的位数会有不够的现象,也就是无限循环小数,这就会造成微差。解决方法其实也很简单使用BigDecimal对象:
public BigDecimal add(double d1, double d2) {
BigDecimal bd1=new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.add(bd2);
}