首页 > 代码库 > 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的差异