Integer类源码剖析
一、Integer类的简介
Integer类是基元类型int的包装类,两者之间可以由编译器自动完成装箱与拆箱,通过反编译后的代码不难看出,自动装箱对应于Integer.valueOf方法、自动拆箱对应于Integer.intValue方法。

Integer继承了Number抽象类,实现了intValue、longValue、floatValue、doubleValue、byteValue、shortValue等导出相应基元数值类型的方法,并且实现了Comparable接口。

二、Integer类的字段
Integer类型是有符号整型,覆盖的范围是[-2^31^,2^31^-1],并且为了方便快速地解析数字字符串或者转换为字符串,预先定义了一些辅助数组如digits、DigitTens、DigitOnes、sizeTable,后面讲到相关方法会再次谈到。
1 | // 最小值:-2^31 |
三、Integer类的构造方法
该构造方法创建一个新的表示特定int值的Integer对象,但是几乎不使用它而是静态工厂方法valueOf,因为其空间和时间性能都更佳。
1 |
|
该构造方法创建一个新分配的Integer对象,该对象表示由String参数指示的int值。字符串完全按照基数10的parseInt方法转换为 int值。
1 |
|
四、Integer类的valueOf方法
valueOf方法返回持有由String参数表示的int值的Integer对象。其中String参数被解析为有符号的十进制整数,等同于调用parseInt(String)方法,换句话说,该方法等价于Integer.valueOf(parseInt(s))。
1 | public static Integer valueOf(String s) throws NumberFormatException { |
valueOf方法返回持有由String参数表示的int值(基为参数radix)的Integer对象。其中String参数被解析为有符号的radix进制整数,等同于调用parseInt(String,int)方法,换句话说,该方法等价于Integer.valueOf(parseInt(s,radix))。
1 | public static Integer valueOf(String s, int radix) throws NumberFormatException { |
valueOf方法使用到了IntegerCache,其[-128,127]范围内的Integer对象已预先创建完成作为缓存,因此我们推荐使用valueOf方法创建Integer对象。
1 | public static Integer valueOf(int i) { |
五、Integer类的整数缓存
IntegerCache是Integer的静态内部类,主要完成常用范围(如[-128~127])内的Integer对象的缓存,可以提高Integer对象的构造性能。
1 | private static class IntegerCache { |
正是因为IntegerCache的存在,因此有必要注意以下测试代码的执行结果:
1 | Integer i1 = 10; |

六、Integer类的parseInt方法

1 | public static int parseInt(String s, int radix) |
七、Integer类的toString系列

注意:如果整形参数i是负数,处理过程中也当作无符号整数处理,最终返回的看作为无符号整数值2^32^+i
1 | public static String toHexString(int i) { |

1 | public static String toOctalString(int i) { |

1 | public static String toBinaryString(int i) { |
以上三个方法最终都会调用底层的toUnsignedString0方法,把传入的val参数当作无符号整型处理,输出省略不必要的前导零,计算出需要显示的字符个数后创建字节数组,从后往前根据val参数的shift位对应的字符填充字节数组。
1 | private static String toUnsignedString0(int val, int shift) { |
测试代码如下:
1 | System.out.println(Integer.toHexString(123)); |

八、Integer类的intValue系列
Integer类的导出基元数值类型的六个方法如下,注意byteValue和shortValue可能会损失精度。
1 | public byte byteValue() { |
九、Integer类的常用方法

1 | public String toString() { |

1 | public int hashCode() { |

1 | public boolean equals(Object obj) { |