首页 > 代码库 > Double与double的差异
Double与double的差异
在使用Double进行逻辑计算的时候,发现个别情况下,逻辑计算的结果与期望的结果有差异。
通过查阅资料发现错用了装箱基本类型Double,总结如下:
基本类型与装箱基本类型的差异:
1、基本类型只有值,而装箱基本类型则具有与其值不同的同一性。也就是说装箱基本类型(例如Double)在进行逻辑运算的时候,是比较其同一性,而不是功能值。
eg:
Double a = 100.1;
Double a = 100.1;
System.out.println("装箱基本类型比较b>a?-1:(a==b?0:1):"+(b>a?-1:(a==b?0:1)));
执行结果:装箱基本类型比较b>a?-1:(a==b?0:1):1
执行结果与预期结果0不一致,由此可以验证装箱基本类型进行逻辑运算时,是其同一性参加运算。
现修改如下:
System.out.println("装箱基本类型转换为基本类型比较b>a?-1:(a==b?0:1):"+(a.doubleValue()>b.doubleValue()?-1:(a.doubleValue()==b.doubleValue()?0:1)));
执行结果:装箱基本类型转换为基本类型比较b>a?-1:(a==b?0:1):0
取装箱基本类型的功能值进行逻辑运算,执行结果与预期相同。
在使用基本类型进行逻辑运算时,因为基本类型无同一性,只有功能值,所以不存在该问题。
eg:
double c = 100.1;
double d = 100.1;
System.out.println("基本类型比较:"+(c>d?-1:(c==d?0:1)));
执行结果为:基本类型比较:0
与预期结果一致
2、基本类型只有功能完备的值,而装箱基本类型除了它对应的基本类型的所有功能值之外,还有个非功能值:null;
eg:
double a1 = null; //编译不通过
Double a2 = null; //编译通过
3、基本类型通常比装箱基本类型更节省时间和空间;因为装箱基本类型比基本类型多了同一性等属性,所以其占用的内存空间自然也比基本类型要大。
eg:
long beginTime = System.currentTimeMillis();
Long sum = 0L;
for(long i=0L;i<Integer.MAX_VALUE;i++){
sum += i;
}
long endTime = System.currentTimeMillis();
System.out.println("装箱基本类型Long的计算时间:"+(endTime-beginTime));
beginTime = System.currentTimeMillis();
long sum_long = 0;
for(long i=0;i<Integer.MAX_VALUE;i++){
sum_long += i;
}
endTime = System.currentTimeMillis();
System.out.println("基本类型long的计算时间:"+(endTime-beginTime));
执行结果:
装箱基本类型Long的计算时间:8753
基本类型long的计算时间:1391
由此可以判断:基本类型要比装箱基本类型节省时间和空间。
4、接口中应使用装箱基本类型,不能使用基本类型。例如:ThreadLocal<Integer>、List<Integer>、Map<Integer,Object>等。
并且,在实体类的映射文件中应该使用装箱基本类型,否则要是数据库该字段为null,则查询该条数据的时候回抛出异常。
本文出自 “梦幻逍遥侠” 博客,请务必保留此出处http://pinmei.blog.51cto.com/7012784/1596062
Double与double的差异