构造方法:

  1. public Integer(int value){
  2. this.value = value;
  3. }
  4. public Integer(String s) throws NumberFormatException {
  5. this.value = parseInt(s,10);
  6. }

IntergerCache:

  1. private static class IntegerCache{
  2. static final int low = -128;
  3. static final int high;
  4. static final Integer cache[];
  5. static{
  6. int h = 127;
  7. String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.IntegerCache.high");
  8. if (integerCacheHighPropValue != null) {
  9. int i = parseInt(integerCacheHighPropValue);
  10. i = math.max(i,127);
  11. h = Math,min(i, Integer.MAX_VALUE - (-low) - 1);
  12. }
  13. high = h;
  14. cache = new Integer[(high - low) + 1];
  15. int j = low;
  16. for(int k = 0; k < cache.length; k++)
  17. cache[k] = new Integer(j++);
  18. }
  19. private IntegerCache() {}
  20. }

cache默认保存-128到127之间的整数值,不new新对象,直接返回cache中对应的数值。其中最大中可以通过第八行代码动态赋值。

  1. Integer a = 100;
  2. Integer a2 = 100;
  3. Integer b = 200;
  4. Integer b2 = 200;
  5. Integer c = new Integer(100);
  6. Integer c2 = new Integer(100);
  7. //print True 因为cache保存 -128到127内, 100<127
  8. System.out.println(a == a2);
  9. //print False 因为cache保存 -128到127内, 200 > 127
  10. System.out.println(b == b2);
  11. //print False 因为没有去找常量池,c,c2都是在堆中申请了空间 返回的引用肯定不一样。
  12. System.out.println(c == c2);

toString:

  1. public static String toString(int i) {
  2. //如果是最小值直接返回其字符串因为Integer.MIN_VALUE=-2147483648 ,这样可以节省下面计算时间
  3. if (i == Integer.MIN_VALUE)
  4. return "-2147483648";
  5. //获取整数值的长度10进制
  6. int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
  7. //创建对应大小的char数组
  8. char[] buf = new char[size];
  9. //得到整数中的每一个字符
  10. getChars(i, size, buf);
  11. //返回字符串值
  12. return new String(buf, true);
  13. }

整个toString方法言简意赅总结:
1.如果小于最小值不用判断直接返回。
2.获取整数长度,通过stringSize方法获取。
3.根据获取的整数长度创建char数组,并获取每一个字符,然后把char数组转换成String类型。
需要注意如果是负数,数组长度要+1,给负号留空间。

stringSize:

  1. //----------------------------------
  2. final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
  3. 99999999, 999999999, Integer.MAX_VALUE };
  4. static int stringSize(int x) {
  5. for (int i=0; ; i++)
  6. if (x <= sizeTable[i])
  7. //判断x是几位数
  8. return i+1;
  9. }

非常巧妙的判断x是几位数,需要注意的是在判断前就做了检查,如果是负数转正后再传递过来。

getChars:

  1. final static char [] digits = {
  2. '0','1','2','3','4','5',
  3. '6','7','8','9','a','b',
  4. 'c','d','e','f','g','h',
  5. 'i','j','k','l','m','n',
  6. 'o','p','q','r','s','t',
  7. 'u','v','w','x','y','z'
  8. }
  9. //--------------------------------------
  10. final static char [] DigitOnes = {
  11. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  12. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  13. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  14. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  15. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  16. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  17. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  18. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  19. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  20. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  21. };
  22. //--------------------------------------
  23. final static char [] DigitTens = {
  24. '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
  25. '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
  26. '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
  27. '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
  28. '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
  29. '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
  30. '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
  31. '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
  32. '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
  33. '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
  34. };
  35. static void getChars(int i, int index, char[] buf) {
  36. int q, r;
  37. int charPos = index;
  38. char sign = 0;
  39. if (i < 0) {
  40. sign = '-';
  41. i = -i;
  42. }
  43. // 当i >= 65536的时候每一次获取两位的char值。
  44. while (i >= 65536) {
  45. q = i / 100;
  46. // really: r = i - (q * 100);
  47. //使用移位操作快速计算出q*100,2^6+2^5+2^2=64+32+4=100
  48. r = i - ((q << 6) + (q << 5) + (q << 2));
  49. i = q;
  50. buf [--charPos] = DigitOnes[r];
  51. buf [--charPos] = DigitTens[r];
  52. }
  53. // 当 i <= 65536的时候每次只获取一位的char值
  54. // assert(i <= 65536, i);
  55. for (;;) {
  56. //q/10,2^19=524288, (double)52429/(1<<19)=0.10000038146972656
  57. q = (i * 52429) >>> (16+3);
  58. // r = i-(q*10) ...
  59. r = i - ((q << 3) + (q << 1));
  60. buf [--charPos] = digits [r];
  61. i = q;
  62. if (i == 0) break;
  63. }
  64. if (sign != 0) {
  65. //如果是负数加上符号位
  66. buf [--charPos] = sign;
  67. }
  68. }

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转二进制字符串