JDK1.8源码解读之Double

515 阅读3分钟

概述

Double类在对象中包装了原始类型double的值。 类型为Double的对象包含一个类型为double的字段。此外,此类还提供了几种将 double转换为String和将String转换为double的方法,以及在处理double时有用的其他常量和方法。

继承关系

public final class Double extends Number implements Comparable

继承自 Number 实现了 Comparable 接口

成员属性

public static final double POSITIVE_INFINITY = 1.0 / 0.0;

定义正无穷大

public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

定义负无穷大

public static final double NaN = 0.0d / 0.0;

保存double类型的非数字

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308

double类型的最大正有限值的常量

public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308

定义double能表示的最小值(二进制最高位是1)

public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324

定义double能保持的正数最小值,(二进制最高位不限制)

public static final int MAX_EXPONENT = 1023;

double能表示的数的最大指数。

public static final int MIN_EXPONENT = -1022;

double能表示的数的最小指数。

public static final int SIZE = 64;

一个double类型的数据需要的存储空间 64位

public static final int BYTES = SIZE / Byte.SIZE;

一个double类型的数据需要的存储空间 8比特

public static final Class TYPE = (Class) Class.getPrimitiveClass("double");

返回Double类型对应的基本数据类型名称,也就是"double"

构造器

public Double(double value) {
    this.value = value;
}
public Double(String s) throws NumberFormatException {
    value = parseDouble(s);
}

关键方法

+ toHexString()

转化为16进制

public static String toHexString(double d) { ... }
+ valueOf()

返回对应的Double值

public static Double valueOf(double d) {
    return new Double(d);
}
##### + valueOf()
转化为Double

public static Double valueOf(String s) throws NumberFormatException { return new Double(parseDouble(s)); }


##### + parseDouble()
Stirng转化为double

public static double parseDouble(String s) throws NumberFormatException { return FloatingDecimal.parseDouble(s); }

##### + isNaN()
判断非数字

public static boolean isNaN(double v) { return (v != v); }

##### + isInfinite()
判断是否正负无穷大

public static boolean isInfinite(double v) { return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY); }

##### + isFinite()
判断是否有限

public static boolean isFinite(double d) { return Math.abs(d) <= DoubleConsts.MAX_VALUE; }

##### + byteValue()
转化为byte类型,

public byte byteValue() { return (byte)value; }

除此之外还有其他类似方法:
shortValue(),intValue(),longValue(),floatValue(),doubleValue()

##### + equals()
类型相同,并且值相同,才会返回true

public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); }

##### + doubleToLongBits()
按照字节位,以long的形式读出来。

public static long doubleToLongBits(double value) { long result = doubleToRawLongBits(value); // Check for NaN based on values of bit fields, maximum // exponent and nonzero significand. if ( ((result & DoubleConsts.EXP_BIT_MASK) == DoubleConsts.EXP_BIT_MASK) && (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L) result = 0x7ff8000000000000L; return result; }


##### + compareTo()
和另一个Double值进行比较。
实际上是两个double,按照long读取出来,进行比较。其相对大小是相同的,但是按照long读取出来会计算更快。

public int compareTo(Double anotherDouble) { return Double.compare(value, anotherDouble.value); }


##### + compare()
两个double进行比较

public static int compare(double d1, double d2) { ... }


##### + sum()
求和

public static double sum(double a, double b) { return a + b; }


##### + min()
求最小值

public static double min(double a, double b) { return Math.min(a, b); }


##### + max()
求最大值

public static double max(double a, double b) { return Math.max(a, b); }

#### 实现原理
##### compare()是如何比较的?
最有意思的一点是,在比较两个double的大小的时候,是按照字节位,以long的形式读取出来的。java基本数据类型的长度如下:

| 类型    | 位(bit)|大小(字节/Byte)  |
| ------- |---| ---------- |
| byte   |  8 |     1     |
| short  | 16  |  2     |
| char   | 16  | 2     |
| int    | 32  | 4     |
| float  | 32  | 4     |
| long   |  64 | 8     |
| double | 64  | 8     |
因为long和double的存储位数是一样的,double按照long读取出来进行比较,和double直接比较,结果是一致的。

#### 希望和大家多多交流
---
我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。