【JAVA源码分析——Java.lang】包装类源码分析

来源:互联网 发布:unity3d 镜面反射 编辑:程序博客网 时间:2024/06/07 14:34

包装类分析

Java 基本类型包括八种:byte、short、int、long、float、double、char、boolean

Number类型

其中数字类型包括:
整数型:
byte : -127~128

short : -32767~32768

int : 0x80000000~0x7fffffff

long : 0x8000000000000000L~0x7fffffffffffffffL

浮点型:
float : 0x0.000002P-126f / 0x1.fffffeP+127f

double : 0x0.0000000000001P-1022 ~ 0x1.fffffffffffffP+1023

java.lang.Number是数字类型对象的抽象类,子类包括Byte、Short、Integer、Long、Float、Double。还有BigDecimal和BigInteger

//定义非抽象方法byteValue 和shortValuepublic byte byteValue() {    return (byte)intValue();}public short shortValue() {    return (short)intValue();}

Number类定义方法如下
Number类方法

Byte

Byte中主要提供的方法有

  • 构造方法
  • toString
  • decode 解码方法,包括二进制、八进制、十六进制 静态工厂方法
  • compare 比较大小 静态工厂方法
  • compareTo 比较大小
  • valueOf 转换为Byte类型 静态工厂方法
  • parseByte 转换为Byte类型
  • intValue 类型转换 等类型转换方法

、、、decode、valueOf、parse
属性域

//最小值public static final byte   MIN_VALUE = -128;//最大值public static final byte   MAX_VALUE = 127;//声明类型//获取JVM本地类型public static final Class<Byte>     TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");//二进制长度public static final int SIZE = 8;//byte存储 private final byte value;//静态内部类private static class ByteCache {    //不提供实例化方法    private ByteCache(){}    //缓存byte的所有值    //好处显而易见,使用比较多时节省内存空间    static final Byte cache[] = new Byte[-(-128) + 127 + 1];    static {        for(int i = 0; i < cache.length; i++)            cache[i] = new Byte((byte)(i - 128));    }}

主要方法

//主要调用了Integer的parseInt方法public static byte parseByte(String s, int radix)    throws NumberFormatException {    int i = Integer.parseInt(s, radix);    if (i < MIN_VALUE || i > MAX_VALUE)        throw new NumberFormatException(            "Value out of range. Value:\"" + s + "\" Radix:" + radix);    return (byte)i;}//调用了Integer.decode 八进制、十六进制转换 public static Byte decode(String nm) throws NumberFormatException {    int i = Integer.decode(nm);    if (i < MIN_VALUE || i > MAX_VALUE)        throw new NumberFormatException(                "Value " + i + " out of range from input " + nm);    return valueOf((byte)i);}//转换其他类型,直接进行强制转换,低级变量向高级变量转换public double doubleValue() {    return (double)value;}

parseType 与 valueOf方法的区别

//返回值是byte,相当于在栈中划分新的内存空间public static byte parseByte(String s, int radix)    throws NumberFormatException {    int i = Integer.parseInt(s, radix);    if (i < MIN_VALUE || i > MAX_VALUE)        throw new NumberFormatException(            "Value out of range. Value:\"" + s + "\" Radix:" + radix);    return (byte)i;}//静态工厂方法,返回包装类,实际存储内容已经缓存在静态内部类中public static Byte valueOf(String s, int radix)    throws NumberFormatException {    return valueOf(parseByte(s, radix));}

Short
short属性域与Btye类似的,所差别的主要是值域范围
short的主要方法也类似于btye,调用的是Integer的方法

Integer
Integer静态域类似于Byte的静态域,包括范围和type。
Byte和Short的toString 都是调用Integer进行实现的。

//提供的进制转换支持字符,根据设定,最高支持36进制转换final static char[] digits = {    '0' , '1' , '2' , '3' , '4' , '5' ,    '6' , '7' , '8' , '9' , 'a' , 'b' ,    'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,    'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,    'o' , 'p' , 'q' , 'r' , 's' , 't' ,    'u' , 'v' , 'w' , 'x' , 'y' , 'z'};//设置进制的toString public static String toString(int i, int radix) {    //判断是否越界    if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)        radix = 10;    //若为10进制,调用toString(int i)    if (radix == 10) {        return toString(i);    }    char buf[] = new char[33];    boolean negative = (i < 0);    int charPos = 32;    //判断正负    if (!negative) {        i = -i;    }    //辗转相除,存储到buff里    while (i <= -radix) {        buf[charPos--] = digits[-(i % radix)];        i = i / radix;    }    buf[charPos] = digits[-i];    if (negative) {        buf[--charPos] = '-';    }    //从数组尾部存储,创建String调用String的截取创建    return new String(buf, charPos, (33 - charPos));}//十进制String转换public static String toString(int i) {    if (i == Integer.MIN_VALUE)        return "-2147483648";    //计算位数    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);    char[] buf = new char[size];    getChars(i, size, buf);    return new String(buf, true);}//定义范围数组,确定String长度final static int [] sizeTable = { 9, 99, 999, 9999, 99999,999999, 9999999,99999999, 999999999, Integer.MAX_VALUE };// 计算输入值位数static int stringSize(int x) {    for (int i=0; ; i++)        if (x <= sizeTable[i])            return i+1;}

看到了Integer的getChars方法,开始没怎么看明白,附知乎大神解释
java源码中Integer.class中有个getChars方法,里面有个52429是怎么确定的?

0 0