jdk源码阅读之Integer

Integer

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

 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',
        } ;
    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',
        } ;
  • 由于int支持36进制,这个通过CharacterMAX_RADIX域看出因此需要36个字符才能表示所有的可能字符。digits就是表示所有可能的字符。
  • DigitTensDigitOnes 这两个域看起来有点奇怪,他们的主要作用是确定0-99之间的数值确认个位和十位的一个数组,比如要知道56的个位和十位,只需DigitTens[56]DigitOnes[56]就可以分别求出了,但是我要求999这个数值的个位和十位怎么办,这样就会导致数组溢出,jdk源码的作者早就知道了,因此把这个方法的访问权限定位default,在外部不能调用,因此只能在内部或者包内调用。注意到这两个域是char[]类型的,其主要作用是用来int到String的转换。这在toString方法中很明显。

toString方法

public static String toString(int i, int radix);
public static String toString(int i)
  • toString(int i)方法将传入的int值转换成对应的10进制字符串
  • toString(int i, int radix)这个方法将i转换成radix进制的字符串,radix的取值范围必须是在2–36之间,否则就转换成10进制的,既然这个方法可以可以转换成10进制,为什么还要上面的方法,这是因为带一个参数的toString方法对10进制转换进行了优化,一次迭代可以求出两位数。

stringSize方法

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

这个方法是用来求x(x>0)的十进制数值的长度,这种方法使用比较的方法,避免了除法和求余操作,优化了速度。

IntegerCache静态内部类

  private static class IntegerCache{...}

这个类的目的在于对-127—128这之间的int值进行缓存,也就是这个类在加载的时候就包含了-127—128的Integer对象,注意这只是对自动装箱的缓存,对于new出来的对象是不进行缓存的。例如:

public class TestDemo1 implements Cloneable {
	public static void main(String[] args) throws Exception {
		Integer a = 1;
		Integer b = 1;
		System.out.println(a == b);

		Integer integer = new Integer(2);
		Integer integer2 = new Integer(2);
		System.out.println(integer == integer2);
	}
}

输出结果:

true
false

toXXXString

public static String toBinaryString(int i) {
        return toUnsignedString0(i, 1);
}
public static String toOctalString(int i) {
        return toUnsignedString0(i, 3);
}
public static String toHexString(int i) {
        return toUnsignedString0(i, 4);
}
  • 顾名思义,上面的方法都是进制的转换,将数值转换成对应的字符串,注意这里转换的都是正数,如果是负数,转换成对应的unsigned值,不像toString方法,可以转换负数。

parseInt方法

public static int parseInt(String s, int radix)
                throws NumberFormatException{...}
public static int parseInt(String s) throws NumberFormatException{...}

这两个方法与toString方法族、toXXXString方法等是相反的作用,将String类型对象根据不同进制转换成10进制的数值类型。这个方法会抛出异常,因为有可能String对象的内容与进制不对应。

hashCode方法

public int hashCode() {
        return Integer.hashCode(value);
    }
public static int hashCode(int value) {
        return value;
    }
  • Integer类的hashCode方法返回的仅仅就是Integer对象代表的int值。

equals方法

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

Integer类的equals方法重写了,比较的不再像Object类中的引用相等,而是值的相等。

compareTo方法

public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }
public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }

这个方法是实现了Comparable接口中的compareTo方法,实现了Comparable接口说明这个类的对象可以比较大小,具体对象的大小就取决于compareTo方法的返回值,返回0表示相等,正数表示大于,负数表示小于。

猜你喜欢

转载自blog.csdn.net/whoami_I/article/details/85763316