Integer类继承了Number类,主要作用是对基本类型int进行了包装,提供了一些处理int的方法。
像parseInt,valueOf,intValue这些方法平时用的非常多,每个人都感觉对Integer很熟,看似这个类的源码好像没什么可看的。不过不看不知道,一看吓一跳,接下来我们来慢慢分析。
看源码之前,可以先看一下Integer的 API文档,原文链接如下:
https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
也可以看我的翻译版,链接如下:
https://blog.csdn.net/lianjiww/article/details/82531336
Integer类源码很长,即便把注释全部去掉也有几大百行,这里就先不把源码全部贴上来,我们一部分一部分的看。而且由于Integer类要研究的内容其实很多,所以会分好几篇文章来讲,本篇先看Integer的几个基本属性。
先看一下Integer类的几个的属性:
@Native public static final int MIN_VALUE = 0x80000000;
@Native public static final int MAX_VALUE = 0x7fffffff;
@SuppressWarnings("unchecked")
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
private final int value;
@Native public static final int SIZE = 32;
public static final int BYTES = SIZE / Byte.SIZE;
MIN_VALUE
:这个静态变量表示int能取的最小值,为0x80000000,也就是-2的31次方。
MAX_VALUE
:这个静态变量表示int能取的最大值,为0x7fffffff,也就是2的31次方减1。
TYPE
:就是基本类型int的类型,把TYPE
打印出来的话就是输出int。
value
:既然Integer是对int的包装,那肯定会有一个int的属性用来保存Integer表示的int值,就是这个value了。
SIZE
:使用二进制补码表示一个int值的bit数。
BYTES
:使用二进制补码表示一个int值的byte数。
接下来看到有几个static的char数组:
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',
} ;
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
这几个数组看起来古怪,其实有妙用。
digits数组包含了用于表示数字的所有可能的字符。int支持从2进制到36进制的表示方式,所以光0-9还不够,得再有a-z总共36个字符才能表示所有不同进制的数字。
DigitTens数组用于获取0到99之间某个数的十位数,比如想要获取28的十位数,那就通过这个数组DigitTens[28],也就是得到2。
DigitOnes数组用于获取0到99之间某个数的个位数,比如想要获取28的个位数,那就通过这个数组DigitOnes[28],也就是得到8。