java.lang包下Number的简介

1. java.lang包下Number的继承关系


首先看下java.lang包下面的数值型包装类的继承结构图,此处仅仅是java.lang包下的,不包含java.math等包下的类。其中Number是抽象基类。他在java.lang包下包含Byte、Short、Integer、Long、Float、Double等子类,下图是他们的继承关系
java.lang包下的字符包装类继承图

java.lang.Number:
数值型包装类的基类,是一个抽象类,一共包含一下几个函数:
抽象函数
1. public abstract int intValue();返回值为基本数据类型int得到对应的int类型的值。
2. public abstract long longValue();
3. public abstract float floatValue();
4. public abstract double doubleValue();
实现函数
5. public byte byteValue() {
return (byte)intValue();
}
得到对应基本数据类型byte值。主义此处调用子类先对象intValue()得到对应的int值,然后在转换成byte类型值。
6. public short shortValue() {
return (short)intValue();
}
得到对应基本数据类型short值。

2.java.lang包下实现类的主要函数


parase函数(paraseFloat,paraseLong…)

基本分为两种包含小数点的浮点型字符串转换成小数和不包含浮点型的字符串转换成整数。不过他们的实现方法基本类似,都是得到字符串的char数组,然后比对ascii码,得到对应数值。
核心代码:

(1)数值计算

do
{
    if(k >= j)
        break;
    if(i2 >= j2)
        flag4 = true;
    switch(c = s.charAt(k++))
    {
    case 48: // '0'
    case 49: // '1'
    case 50: // '2'
    case 51: // '3'
    case 52: // '4'
    case 53: // '5'
    case 54: // '6'
    case 55: // '7'
    case 56: // '8'
    case 57: // '9'
        i2 = i2 * 10 + (c - 48);
        break;

    default:
        k--;
        break label1;
    }
} while(true);      

可以看出他是通过遍历字符串的char数组,然后比对ascii码来得到对应的数字然后计算对应的数值。

(2)正负号的处理:

k = 0;
switch(c = s.charAt(k))
{
case 45: // '-'
    flag = true;
    // fall through

case 43: // '+'
    k++;
    flag1 = true;
    // fall through

default:
    c = s.charAt(k);
    break;
}

可以看出正负号同样是匹配ascii码。

(3)小数点的处理

case 46: // '.' 
    if(flag3)
        throw new NumberFormatException("multiple points");
    j1 = k;
    if(flag1)
        j1--;
    flag3 = true;
    break;
}

小数点的处理包含了一个标记flag3
以上是paras函数的初步说明,相关详细说明会在以后仔细研究。

equals函数

Long、Integer、Byte和Short的equals函数

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

以上可知当且仅当传入的obj是Integr对象且他们表示的int值相同返回true。
此处

Integer value = new Integer(10);  
System.out.println(value.equals(10));   //true  传入值为Integer对象,且值和value相同
System.out.println(value.equals((short)10));    //false 传入值是Short对象不是Integer对象
System.out.println(value.equals("10"));    //false 传入值是String对象不是Integer对象

Double、Float的equals函数

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

以上可知当且仅当obj为Float类型且floatToIntBits的返回结果相同时相等
此处floatToIntBits函数可以参考这篇文章
http://www.yiibai.com/javalang/float_floattointbits.html
floatToIntBits即返回该浮点数的IEEE 754 浮点“单一格式”位布局
即该浮点值的一种表示方法。

Float value = new Float(12.12);
System.out.println(value.equals(12.12));  //false 传入值是Double对象不是Float对象
System.out.println(value.equals((float)12.12));   //true  传入值为Integer对象,且值和value相同
System.out.println(value.equals("12.12"));   //false 传入值是String对象不是Float对象


注意:此处12.12默认转换的包装类型是Double而不是Float所以value.equals(12.12)返回的是false

其他函数

注:此处以Integer说明
1. toString 将对应的数值转换成相应的字符串
2. valueOf 实际调用ParasInteger
3. hashcode Byte、Short、Integer基本都是直接返回value的int值,Long无符号右移32位取intzhi。Float和Double直接取 浮点数的IEEE 754 浮点“单一格式”位布局的整形。
4. 构造函数提供了Integer(String s)的形式,内部直接将对应String转换为相应基本数据类型值,然后调用Integer(int)的构造函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值