Integer类继承Number类,实现Comparable接口。Integer类被修饰为final,所以其不可被继承。

字段

MIN_VALUE

最小值,@Native表示该字段可以从本地代码引用。

@Native public static final int MIN_VALUE = 0x80000000;

MAX_VALUE

最大值。

@Native public static final int MAX_VALUE = 0x7fffffff;

TYPE

类原始类型int的类实例。@SuppressWarnings(“unchecked”)表示该字段应该抑制unchecked的编译器警告。

@SuppressWarnings(\"unchecked\")
public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass(\"int\");

digits

所有可以表示为字符的数字。此变量是默认修饰符 ,只能在包内访问。

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\'
	};

DigitTens

处理大的数,代表十位。

final static char [] DigitTens = {
    \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\', \'0\',
    \'1\', \'1\', \'1\', \'1\', \'1\', \'1\', \'1\', \'1\', \'1\', \'1\',
    \'2\', \'2\', \'2\', \'2\', \'2\', \'2\', \'2\', \'2\', \'2\', \'2\',
    \'3\', \'3\', \'3\', \'3\', \'3\', \'3\', \'3\', \'3\', \'3\', \'3\',
    \'4\', \'4\', \'4\', \'4\', \'4\', \'4\', \'4\', \'4\', \'4\', \'4\',
    \'5\', \'5\', \'5\', \'5\', \'5\', \'5\', \'5\', \'5\', \'5\', \'5\',
    \'6\', \'6\', \'6\', \'6\', \'6\', \'6\', \'6\', \'6\', \'6\', \'6\',
    \'7\', \'7\', \'7\', \'7\', \'7\', \'7\', \'7\', \'7\', \'7\', \'7\',
    \'8\', \'8\', \'8\', \'8\', \'8\', \'8\', \'8\', \'8\', \'8\', \'8\',
    \'9\', \'9\', \'9\', \'9\', \'9\', \'9\', \'9\', \'9\', \'9\', \'9\',
	} ;

DigitOnes

处理大的数,代表个位。

final static char [] DigitOnes = {
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\',
	} ;

sizeTable

为了得到十进制的位数。

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                      99999999, 999999999, Integer.MAX_VALUE };

value

Integer的值,value被定义为final,即常量,值不可更改。

private final int value;

SIZE

用于表示二进制补码二进制形式的 int值的位数。

@Native public static final int SIZE = 32;

BYTES

用于表示二进制补码二进制形式的 int值的字节数。

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

serialVersionUID

Integer的序列化版本号。

@Native private static final long serialVersionUID = 1360826667806852920L;

构造方法

Integer(int value)

public Integer(int value) {
    this.value = value;
}

Integer(String s)

public Integer(String s) throws NumberFormatException {
    this.value = parseInt(s, 10);
}

方法

toString(int i, int radix)

i是要转换为字符串的整数,radix是在字符串表示中使用的基数,返回基数radix表示的i的字符串。

public static String toString(int i, int radix) {
    // 如果radix不在合法的基数范围之内,使用10作为基数,范围2~36。
    if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
        radix = 10;

    // 如果基数是10,使用更加快速的转换方法。
    if (radix == 10) {
        return toString(i);
    }

    // Integer转化为以2为基数的字符串最多需要32位,并且有可能需要一位来表示\'-\'字符。
    char buf[] = new char[33];
    boolean negative =(i < 0);
    // buf[]下标。
    int charPos = 32;

    // 如果i是非负数,将i变为负数。
    if (!negative) {
        i = -i;
    }

    // 计算i转换为以radix为基数的值,从后向前遍历buf[],并放入bug中。
    // 转化为负数来操作是因为正数取不到128。
    while (i <= -radix) {
        buf[charPos--] = digits[-(i % radix)];
        i = i / radix;
    }
    buf[charPos] = digits[-i];

    // 如果是负数,加上字符\'-\'。
    if (negative) {
        buf[--charPos] = \'-\';
    }

   	// 返回buf[]中有值的部分的字符串。
    return new String(buf, charPos, (33 - charPos));
}

toUnsignedString(int i, int radix)

i是要转换为字符串的整数,radix是在字符串表示中使用的基数,返回无符号整数i以基数radix表示的字符串。具体参考Long的源码阅读。

public static String toUnsignedString(int i, int radix) {
    return Long.toUnsignedString(toUnsignedLong(i), radix);
}

toHexString(int i)

i是要转换为字符串的整数,返回无符号整数i以基数16表示的字符串。

public static String toHexString(int i) {
    return toUnsignedString0(i, 4);
}

toOctalString(int i)

i是要转换为字符串的整数,返回无符号整数i以基数8表示的字符串。

public static String toOctalString(int i) {
    return toUnsignedString0(i, 3);
}

toBinaryString(int i)

i是要转换为字符串的整数,返回无符号整数i以基数2表示的字符串。

public static String toBinaryString(int i) {
    return toUnsignedString0(i, 1);
}

toUnsignedString0(int val, int shift)

将val转换为以shift表示的基数的字符串,val是要转换的整数,shift是log2xlog_{2}xlog2x的值,x是进制数。

private static String toUnsignedString0(int val, int shift) {
    // assert shift > 0 && shift <=5 : \"Illegal shift value\";
    // 得到val的二进制的有意义的位数,例如126对应的msg是7,-126对应的mag是32。
    int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
    // msg位数转换为2^shift进制的位数
    int chars = Math.max(((mag + (shift - 1)) / shift), 1);
    char[] buf = new char[chars];

    // 进行转换
    formatUnsignedInt(val, shift, buf, 0, chars);

    // Use special constructor which takes over \"buf\".
    return new String(buf, true);
}

formatUnsignedInt(int val, int shift, char[] buf, int offset, int len)

val是要格式化的整数,shift是要格式化的基数的代表,4代表十六进制,3代表八进制,1代表二进制,buf是要写入的字符数组,offset是buf中开始的位置,len是要写入buf的长度,返回buf中最低位的位置。

static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
    int charPos = len;
    int radix = 1 << shift;
    int mask = radix - 1;
    // 此过程相当于从右向左遍历val的二进制,每shift位转换为十进制对应radix进制的一位数。
    // 就如同二进制转换为十六进制时,每四位换算成十进制就是十六进制的一位;二进制转换为八进制时,每三位换算成十进制就是八进制的一位。
    do {
        buf[offset + --charPos] = Integer.digits[val & mask];
        val >>>= shift;
    } while (val != 0 && charPos > 0);

    return charPos;
}

toString(int i)

将i转换为string类型,返回String类型的i。

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);
}

toUnsignedString(int i)

public static String toUnsignedString(int i) {
    return Long.toString(toUnsignedLong(i));
}

getChars(int i, int index, char[] buf)

将整数i一个字符一个字符地写入buf,index是buf的起始位置。

static void getChars(int i, int index, char[] buf) {
    int q, r;
    // buf的下标
    int charPos = index;
    // 正负数标志
    char sign = 0;

    // 如果是负数,将sign赋值为\'-\'
    if (i < 0) {
        sign = \'-\';
        i = -i;
    }

    // Generate two digits per iteration
    // 以中间位数为界限,大的数使用一种算法,小的数使用一种算法
    // 2^16=65536
    while (i >= 65536) {
        q = i / 100;
        // really: r = i - (q * 100);
        // (q << 6) + (q << 5) + (q << 2) = q * (2^6 + 2^5 + 2^2) = q * 100
        r = i - ((q << 6) + (q << 5) + (q << 2));
        i = q;
        buf [--charPos] = DigitOnes[r];
        buf [--charPos] = DigitTens[r];
    }

    // Fall thru to fast mode for smaller numbers
    // assert(i <= 65536, i);
    for (;;) {
        // 为什么不使用i/10呢???因为效率方面乘法优于除法,位运算优于乘法
        // 2^19=524288
        // 2^15<52429<2^16
        // 为什么是16+3呢???为了精度
        q = (i * 52429) >>> (16+3);
        r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...
        buf [--charPos] = digits [r];
        i = q;
        if (i == 0) break;
    }
    // 符号
    if (sign != 0) {
        buf [--charPos] = sign;
    }
}

stringSize(int x)

获取整型x转为string之后的字符串长度。

static int stringSize(int x) {
    for (int i=0; ; i++)
        if (x <= sizeTable[i])
            return i+1;
}

parseInt(String s, int radix)

将字符串s以radix为基数转换为有符号整型数。如果发生以下任何一种情况,则抛出类型NumberFormatException的异常:

  • 第一个参数是null或是长度为零的字符串。
  • 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX
  • 字符串的任何字符不是指定基数的数字,除了第一个字符可能是减号或加号,前提是字符串长度大于1.
  • 由字符串表示的值不是int类型的值。
public static int parseInt(String s, int radix) throws NumberFormatException {

	if (s == null) {
        throw new NumberFormatException(\"null\");
    }

    if (radix < Character.MIN_RADIX) {
        throw new NumberFormatException(\"radix \" + radix + \" less than Character.MIN_RADIX\");
    }

    if (radix > Character.MAX_RADIX) {
        throw new NumberFormatException(\"radix \" + radix + \" greater than Character.MAX_RADIX\");
    }

    int result = 0;
    boolean negative = false;
    int i = 0, len = s.length();
    int limit = -Integer.MAX_VALUE;
    int multmin;
    int digit;

    if (len > 0) {
        char firstChar = s.charAt(0);
        // 首先检查第一个字符是否是符号
        if (firstChar < 

					
				
收藏 打印
您的足迹: