构造方法:
public Integer(int value){this.value = value;}public Integer(String s) throws NumberFormatException {this.value = parseInt(s,10);}
IntergerCache:
private static class IntegerCache{static final int low = -128;static final int high;static final Integer cache[];static{int h = 127;String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.IntegerCache.high");if (integerCacheHighPropValue != null) {int i = parseInt(integerCacheHighPropValue);i = math.max(i,127);h = Math,min(i, Integer.MAX_VALUE - (-low) - 1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}}
cache默认保存-128到127之间的整数值,不new新对象,直接返回cache中对应的数值。其中最大中可以通过第八行代码动态赋值。
Integer a = 100;Integer a2 = 100;Integer b = 200;Integer b2 = 200;Integer c = new Integer(100);Integer c2 = new Integer(100);//print True 因为cache保存 -128到127内, 100<127System.out.println(a == a2);//print False 因为cache保存 -128到127内, 200 > 127System.out.println(b == b2);//print False 因为没有去找常量池,c,c2都是在堆中申请了空间 返回的引用肯定不一样。System.out.println(c == c2);
toString:
public static String toString(int i) {//如果是最小值直接返回其字符串因为Integer.MIN_VALUE=-2147483648 ,这样可以节省下面计算时间if (i == Integer.MIN_VALUE)return "-2147483648";//获取整数值的长度10进制int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);//创建对应大小的char数组char[] buf = new char[size];//得到整数中的每一个字符getChars(i, size, buf);//返回字符串值return new String(buf, true);}
整个toString方法言简意赅总结:
1.如果小于最小值不用判断直接返回。
2.获取整数长度,通过stringSize方法获取。
3.根据获取的整数长度创建char数组,并获取每一个字符,然后把char数组转换成String类型。
需要注意如果是负数,数组长度要+1,给负号留空间。
stringSize:
//----------------------------------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])//判断x是几位数return i+1;}
非常巧妙的判断x是几位数,需要注意的是在判断前就做了检查,如果是负数转正后再传递过来。
getChars:
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 [] 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',};//--------------------------------------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',};static void getChars(int i, int index, char[] buf) {int q, r;int charPos = index;char sign = 0;if (i < 0) {sign = '-';i = -i;}// 当i >= 65536的时候每一次获取两位的char值。while (i >= 65536) {q = i / 100;// really: r = i - (q * 100);//使用移位操作快速计算出q*100,2^6+2^5+2^2=64+32+4=100r = i - ((q << 6) + (q << 5) + (q << 2));i = q;buf [--charPos] = DigitOnes[r];buf [--charPos] = DigitTens[r];}// 当 i <= 65536的时候每次只获取一位的char值// assert(i <= 65536, i);for (;;) {//q/10,2^19=524288, (double)52429/(1<<19)=0.10000038146972656q = (i * 52429) >>> (16+3);// r = i-(q*10) ...r = i - ((q << 3) + (q << 1));buf [--charPos] = digits [r];i = q;if (i == 0) break;}if (sign != 0) {//如果是负数加上符号位buf [--charPos] = sign;}}
1.在 i >= 65536 的时候每次能够求出2位的char 值。(while循环中)
2.65536的时候每次只获取一位的char值。(for循环中)
3.q = (i * 52429) >>> (16+3); 等价于 q/10,
r = i - ((q << 3) + (q << 1)); 等价于 r = i-(q*10),
for循环中每次取到对应的个位,放到指定的char数组位置中。
4.while循环的作用和for相同,只不过while循环一次取出来两个数。
例如 65536,先/100 得出655 然后65536-655*100 = 36
然后将30赋值到数组中,个位赋值个位,十位赋值十位。一次赋值两位之后的 i也缩减了两位。
进制转换:
toHexString:
int转十六进制字符串
toOctalString:
int转八进制字符串
toBinaryStrng:
int转二进制字符串
