// 表示double实际上可以表示的最小非零正数:4.9e-324
// 小数点前为0x0
// 它的值和Double.longBitsToDouble(0x1L)计算的结果相同
public static final double MIN_VALUE = 0x0.0000000000001P-1022;
// double可以表示的最大指数
public static final int MAX_EXPONENT = 1023;
// double可以表示的最小指数
public static final int MIN_EXPONENT = -1022;
// double占的位数
public static final int SIZE = 64;
// 一个double数值占的字节数
public static final int BYTES = SIZE / Byte.SIZE;
// 抑制没有类型检查而出现的警告
@SuppressWarnings("unchecked")
// Double类中对应的原始的double
// Double.class和double.class不相等,但Double.TYPE和double.class相等
public static final Class<Double> TYPE = (Class<Double>) Class.getPrimitiveClass("double");
// 用于存储double的数值
private final double value;
// 用于序列化
private static final long serialVersionUID = -9172774392245257468L;
[]( )2.构造方法
------------------------------------------------------------------------
### []( )1)参数为double
**Double.java中的相关代码:**
public Double(double value) {
// 保存到全局变量
this.value = value;
}
### []( )2)参数为String
**Double.java中的相关代码:**
public Double(String s) throws NumberFormatException {
// 调用parseDouble方法,将字符串解析成double型数值
value = parseDouble(s);
}
[]( )3\. parseDouble方法
-----------------------------------------------------------------------------------
将字符串解析成double型数值。
**Double.java中的相关代码:**
public static double parseDouble(String s) throws NumberFormatException {
// 调用FloatingDecimal的parseDouble方法
return FloatingDecimal.parseDouble(s);
}
[]( )4\. valueOf方法
-------------------------------------------------------------------------------
### []( )1)参数为double
将double型数值转换为Double对象。
**Double.java中的相关代码:**
public static Double valueOf(double d) {
// 创建Double对象,对double数值进行封装,返回
return new Double(d);
}
### []( )2)参数为String
将String对象转换为Double对象。
**Double.java中的相关代码:**
public static Double valueOf(String s) throws NumberFormatException {
// 调用parseDouble方法,将字符串解析成double型数值
// 创建Double对象,对double数值进行封装,返回
return new Double(parseDouble(s));
}
[]( )5\. isNaN方法
-----------------------------------------------------------------------------
判断当前的数是不是数值型的数。
**Double.java中的相关代码:**
public boolean isNaN() {
// 调用了重载方法
return isNaN(value);
}
调用重载的isNaN方法。
判断double型的数是不是数值型的数。
**Double.java中的相关代码:**
public static boolean isNaN(double v) {
// 每个NaN的存储地址不同
return (v != v);
}
[]( )6\. isInfinite方法
----------------------------------------------------------------------------------
判断当前的数是不是无穷大。
**Double.java中的相关代码:**
public boolean isInfinite() {
// 调用了重载方法
return isInfinite(value);
}
调用了重载的isInfinite方法。
判断double型的数是不是无穷大。
**Double.java中的相关代码:**
public static boolean isInfinite(double v) {
// 判断是否为正无穷或负无穷
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
[]( )7\. isFinite方法
--------------------------------------------------------------------------------
判断一个double型的数是否有限。
**Double.java中的相关代码:**
public static boolean isFinite(double d) {
// 对double数取绝对值,判断是否小于等于double能表示的最大值
return Math.abs(d) <= DoubleConsts.MAX_VALUE;
}
[]( )8\. doubleToLongBits方法
----------------------------------------------------------------------------------------
将double型的数转换成满足IEEE 754浮点型表示法的long型的数。
**符号位MASK:0x8000000000000000L
指数位MASK:0x7ff0000000000000L
有效位MASK:0x000fffffffffffffL
正无穷:0x7ff0000000000000L
负无穷:0xfff0000000000000L
NaN:0x7ff8000000000000L**
**Double.java中的相关代码:**
public static long doubleToLongBits(double value) {
// 调用doubleToRawLongBits转换成long型的数
// 详解在1)处
long result = doubleToRawLongBits(value);
// 根据指数位和非零有效位判断是不是NaN
if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
DoubleConsts.EXP_BIT_MASK) &&
(result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
// 若是,则设置为NaN
result = 0x7ff8000000000000L;
// 返回
return result;
}
### []( )1)doubleToRawLongBits方法
**Double.java中的相关代码:**
public static native long doubleToRawLongBits(double value);
该方法是一个native方法,该方法会将一个double型的数转换成满足IEEE 754浮点型表示法的long型的数,即使该数为NaN,也会进行转换。
[]( )9\. longBitsToDouble方法
----------------------------------------------------------------------------------------
将long型的数按照IEEE 754浮点数标准转换为double型的数。
**Double.java中的相关代码:**
public static native double longBitsToDouble(long bits);
该方法是一个native方法。
[]( )10\. toString方法
---------------------------------------------------------------------------------
将Double对象转换为String对象。
**Double.java中的相关代码:**
public String toString() {
// 调用了重载方法
return toString(value);
}
调用了重载的toString方法。
**Double.java中的相关代码:**
public static String toString(double d) {
// 调用FloatingDecimal的toJavaFormatString方法
return FloatingDecimal.toJavaFormatString(d);
}
[]( )11\. toHexString方法
------------------------------------------------------------------------------------
将double型的数转换为十六进制的String对象。
**Double.java中的相关代码:**
public static String toHexString(double d) {
// 若该数不是有限的,即超过了double型的最大值或者为NaN
if (!isFinite(d) )
// 调用toString方法进行转换
return Double.toString(d);
else { // 若该数有限
// 用来保存转换的十六进制的字符串
StringBuilder answer = new StringBuilder(24);
// 若为负数
if (Math.copySign(1.0, d) == -1.0)
// 拼接一个负号
answer.append("-");
// 拼接16进制的标识符
answer.append("0x");
// 求绝对值
d = Math.abs(d);
// 若数值为0
if(d == 0.0) {
// 则拼接“0.0p0”,即0乘以2的0次方,为0
answer.append("0.0p0");
} else { // 若不为零
// 判断数值是否超过了正常的最小正数
boolean subnormal = (d < DoubleConsts.MIN_NORMAL);
// 调用doubleToLongBits方法
// 将其转换成满足IEEE 754浮点型标准的long型数
// 进行与运算,64到52位变为0
// 提取51到0位,即有效位(尾数部分)
// 最后进行或运算,最高位,即64位,置为1
long signifBits = (Double.doubleToLongBits(d)
& DoubleConsts.SIGNIF_BIT_MASK) |
0x1000000000000000L;
// 若数值小于正常的最小正数
// 则拼接”0.”,即0x0.
// 否则,拼接”1.”,即0x1.
answer.append(subnormal ? "0." : "1.");
// 调用Long的toHexString方法
// 将有效位转换为16进制表示的字符串,截取从第三位到第十六位
// 64位二进制转换位十六进制为16位(0到15)
// 十六位中,前三位(0,1,2)表示符号位和指数部分
// 有效位从第四位(3)开始
String signif = Long.toHexString(signifBits).substring(3,16);
// 若有效位都是0,则直接拼接一个”0”
// 若不全为0,则进行正则表达式匹配
// 从后向前,去掉最少一个最多12个的”0”
answer.append(signif.equals("0000000000000") ?
"0":
signif.replaceFirst("0{1,12}$", ""));
// 拼接p,表示指数中以2为底数
answer.append('p');
// 若数值小于正常的最小正数
// 则指数部分拼接最小指数
// 否则,调用Math的getExponent方法获取指数,再拼接
answer.append(subnormal ?
DoubleConsts.MIN_EXPONENT:
Math.getExponent(d));
}
// 获取字符串,返回
return answer.toString();
}
}
[]( )12\. byteValue方法
----------------------------------------------------------------------------------
获取当前数值对应的byte型数。
**Double.java中的相关代码:**
public byte byteValue() {
// 进行类型转换,返回
return (byte)value;
}
[]( )13\. shortValue方法
-----------------------------------------------------------------------------------
获取当前数值对应的short型数。
**Double.java中的相关代码:**
public short shortValue() {
// 进行类型转换,返回
return (short)value;
}
[]( )14\. intValue方法
---------------------------------------------------------------------------------
获取当前数值对应的int型数。
**Double.java中的相关代码:**
public int intValue() {
// 进行类型转换,返回
return (int)value;
}
[]( )15\. longValue方法
----------------------------------------------------------------------------------
获取当前数值对应的long型数。
**Double.java中的相关代码:**
public long longValue() {
// 进行类型转换,返回
return (long)value;
}
[]( )16\. floatValue方法
-----------------------------------------------------------------------------------
获取当前数值对应的float型数。
**Double.java中的相关代码:**
public float floatValue() {
// 进行类型转换,返回
return (float)value;
}
[]( )17\. doubleValue方法
------------------------------------------------------------------------------------
获取当前数值对应的double型数。
**Double.java中的相关代码:**
public double doubleValue() {
// 直接返回
return value;
}
[]( )18\. hashCode方法
---------------------------------------------------------------------------------
获取Double对象的哈希值。
**Double.java中的相关代码:**
@Override
public int hashCode() {
// 调用Double的静态方法
return Double.hashCode(value);
}
### []( )1)hashCode方法
**Double.java中的相关代码:**
public static int hashCode(double value) {
// 将value转换成满足IEEE 754浮点型标准的long型数
long bits = doubleToLongBits(value);
// 将其不带符号右移32位,再和原数进行异或运算
// 最后进行类型转换,返回
return (int)(bits ^ (bits >>> 32));
}
[]( )19\. equals方法
-------------------------------------------------------------------------------