【后端之旅】源码分析 Integer 篇

185 阅读6分钟

从今天开始,我尽量每天分析一个源 Java 文件,以梳理重要的类都具有哪些功能。

常量

  • MIN_VALUE - 获得整型的最小值

  • MAX_VALUE - 获得整型的最大值

  • TYPE - 获得整型的类型

    值其实就是 "int"

  • SIZE - 本类型的值在二进制形式占据多少比特

  • BYTES - 本类型的值在二进制形式占据多少字节

静态方法

  • Integer.toString(int i, int radix) - 把整数 i 转换为 radix 进制(最小是 2,最大是 36)值的字符串

    转换的结果是小写字符,如果需要大写字符,可以参考以下示例

    String str = Integer.toString(254, 16).toUpperCase();
    
  • Integer.toUnsignedString(int i, int radix) - 把无符号整数 i 转换为 radix 进制(最小是 2,最大是 36)值的字符串

    这里的操作,取巧使用 Long 代替了 Integer,从而实现了 i 的无符号化。

  • Integer.toHexString(int i) - 把整数 i 转换为 16 进制值的字符串

  • Integer.toOctalString(int i) - 把整数 i 转换为 8 进制值的字符串

  • Integer.toBinaryString(int i) - 把整数 i 转换为 2 进制值的字符串

  • Integer.toString(int i) - 把整数 i 转换为 10 进制值的字符串

  • Integer.toUnsignedString(int i) - 把无符号整数 i 转换为 10 进制值的字符串

    这里的操作,取巧使用 Long 代替了 Integer,从而实现了 i 的无符号化。

  • Integer.parseInt(String s, int radix) - 数字字符串 s 根据 radix 进制(最小是 2,最大是 36)转换为整数值

    /**
     * 合法的解析
        */
    Integer.parseInt("0", 10);      // 返回 0
    Integer.parseInt("473", 10);    // 返回 473
    Integer.parseInt("+42", 10);    // 返回 42
    Integer.parseInt("-0", 10);     // 返回 0
    Integer.parseInt("-FF", 16);    // 返回 -255
    Integer.parseInt("1100110", 2); // 返回 102
    
    /**
     * 非法的解析,最终抛出 NumberFormatException 异常
        */
    Integer.parseInt("99", 8);
    Integer.parseInt("Kona", 10);
    
  • Integer.parseInt(String s) - 数字字符串 s 根据 10 进制转换为整数值

  • Integer.parseUnsignedInt(String s, int radix) - 无符号数字字符串 s 根据 radix 进制(最小是 2,最大是 36)转换为整数值

    因为要求无符号,所以如果 s 首字母为 "-" 字符的话,会抛出 NumberFormatException 异常。

    另外,s 所表示的具体数字,也不能大于 2^32 - 1,否则也会抛出 NumberFormatException 异常。

  • Integer.parseUnsignedInt(String s) - 无符号数字字符串 s 根据 10 进制转换为整数值

  • Integer.valueOf(String s, int radix) - 数字字符串 s 根据 radix 进制(最小是 2,最大是 36)转换为整数值,并返回该整数值的包装(Integer)对象

  • Integer.valueOf(String s) - 数字字符串 s 根据 10 进制转换为整数值,并返回该整数值的包装(Integer)对象

  • Integer.valueOf(int i) - 整数 i 转换为包装(Integer)对象

    如果 i 的范围在 -128 到 127 (包含)之间,则直接返回缓存池中的对象,否则返回新的对象。

  • Integer.hashCode(int value) - 返回整数 value 的哈希码,其实就是 value 本身

  • Integer.getInteger(String nm) - 根据给定的字符串 nm,返回一个包装(Integer)对象,如果 nm 解析的结果为 null,则返回 null

  • Integer.getInteger(String nm, int val) - 根据给定的字符串 nm,返回一个包装(Integer)对象,如果 nm 解析的结果为 null,则返回 val 的包装(Integer)对象

  • Integer.getInteger(String nm, Integer val) - 根据给定的字符串 nm,返回一个包装(Integer)对象,如果 nm 解析的结果为 null,则返回 val

  • Integer.decode(String nm) - 解码 nm 数字字符串为整数值,并返回该整数值的包装(Integer)对象

    nm 的格式可以是:

    • "-139" 十进制
    • "0x3ff" 十六进制
    • "-0X3ff" 十六进制
    • "#3ff" 十六进制
    • "076" 八进制
    • "+076" 八进制

    如果 nm 为 null 或空字符串,则抛出 NumberFormatException 异常。

  • Integer.compare(int x, int y) - 比较两个整数值,如果 x 小于 y 返回 -1,如果 x 等于 y 返回 0,如果 x 大于 y 返回 1

  • Integer.compareUnsigned(int x, int y) - 比较两个无符号整数值,如果 x 小于 y 返回 -1,如果 x 等于 y 返回 0,如果 x 大于 y 返回 1

    这里,x 和 y 的无符号化,取巧使用 long 代替了 int,从而实现了 x 和 y 的无符号化。具体操作是调用 compare(long x, long y) 方法,代码为 compare(x + Integer.MIN_VALUE, y + Integer.MIN_VALUE)

  • Integer.toUnsignedLong(int x) - 把无符号整数 x 转换为 long 的无符号值,并返回该 long 值

  • Integer.divideUnsigned(int dividend, int divisor) - 无符号整数 x 除以无符号整数 y 的商 (int)

  • Integer.remainderUnsigned(int dividend, int divisor) - 无符号整数 x 除以无符号整数 y 的余数 (int)

  • Integer.highestOneBit(int i) - 整数 i 中最左侧比特的 1 保留,其余位置置 0,然后返回该值 (int)

  • Integer.lowestOneBit(int i) - 整数 i 中最右侧比特的 1 保留,其余位置置 0,然后返回该值 (int)

  • Integer.numberOfLeadingZeros(int i) - 返回整数 i 中最左侧的(前导) 0 的个数,例如 i 为 0 则返回 32

  • Integer.numberOfTrailingZeros(int i) - 返回整数 i 中最右侧的(尾随) 0 的个数,例如 i 为 0 则返回 32

  • Integer.bitCount(int i) - 返回整数 i 中 1 的个数

  • Integer.rotateLeft(int i, int distance) - 返回整数 i 循环左移 distance 位后的值

  • Integer.rotateRight(int i, int distance) - 返回整数 i 循环右移 distance 位后的值

  • Integer.reverse(int i) - 返回整数 i 比特翻转后的值

    具体的操作是最高位与最低位交换,次高位与次低位交换,以此类推,直到全部的比特都实现交换。

    例如 0x12345678 翻转后得到 0x1e6a2c48 。

  • Integer.signum(int i) - 返回整数 i 的符号值,如果 i 为 0 则返回 0,如果 i 为正数则返回 1,如果 i 为负数则返回 -1

  • Integer.reverseBytes(int i) - 返回整数 i 字节翻转后的值

    具体的操作是最高字节与最低字节交换,次高字节与次低字节交换,以此类推,直到全部的字节都实现交换。

    例如 0x12345678 翻转后得到 0x78563412 。

  • Integer.sum(int a, int b) - 返回两个整数 a 和 b 的和

  • Integer.max(int a, int b) - Math.max(int a, int b) 的别名

  • Integer.min(int a, int b) - Math.min(int a, int b) 的别名

实例方法

  • Integer.instance.byteValue() - 返回本包装(Integer)对象对应的 byte 强制转换值

  • Integer.instance.shortValue() - 返回本包装(Integer)对象对应的 short 强制转换值

  • Integer.instance.intValue() - 返回本包装(Integer)对象对应的 int 值

  • Integer.instance.longValue() - 返回本包装(Integer)对象对应的 long 强制转换值

  • Integer.instance.floatValue() - 返回本包装(Integer)对象对应的 float 强制转换值

  • Integer.instance.doubleValue() - 返回本包装(Integer)对象对应的 double 强制转换值

  • Integer.instance.toString() - 返回本包装(Integer)对象对应的值的 10 进制字符串

  • Integer.instance.hashCode() - 返回本包装(Integer)对象对应的值的哈希码,其实就是当前的 int 值

  • Integer.instance.equals(Object obj) - 判断本包装(Integer)对象对应的类型(通过 instanceof 运算符)和值是否均与给定的 obj 对象一致,一致返回 true,否则返回 false

  • Integer.instance.compareTo(Integer anotherInteger) - 比较本包装(Integer)对象对应的值和给定的 anotherInteger 对象对应的值,如果前者小于后者返回 -1,如果前者大于后者返回 1,否则返回 0

小结

可以看到,Integer 类可用于处理 数串转换、进制转换、比特运算 等。