🌟 Java Integer 类详解

java.lang.Integer 是 Java 中对基本类型 int包装类(Wrapper Class),属于 Number 类的子类。它提供了将 int 值包装成对象的能力,支持在集合(如 List<Integer>)、泛型、反射等场景中使用。


一、核心概念

1. 基本信息

  • 包路径java.lang.Integer
  • 继承关系
    public final class Integer extends Number implements Comparable<Integer>
    
  • 不可变性Integer 是不可变对象(Immutable),一旦创建,其值不能更改。
  • 自动装箱/拆箱:Java 5 引入的特性,支持 intInteger 自动转换。

2. 主要用途

  • 在集合中存储整数(如 List<Integer>)。
  • 方法参数需要对象类型时。
  • 使用泛型。
  • 字符串与整数之间的转换。
  • 进制转换(二进制、八进制、十六进制)。
  • 位运算支持。

3. 静态常量

Integer.MAX_VALUE    // 2^31 - 1 = 2147483647
Integer.MIN_VALUE    // -2^31   = -2147483648
Integer.SIZE         // 32(位)
Integer.BYTES        // 4(字节)

二、操作步骤(详细步骤)

✅ 1. 创建 Integer 对象(装箱)

方法一:使用构造函数(已过时,不推荐)

Integer i1 = new Integer(100);        // 已废弃,Java 9 起不推荐
Integer i2 = new Integer("123");

方法二:使用静态工厂方法(推荐)

Integer i1 = Integer.valueOf(100);           // 推荐!支持缓存
Integer i2 = Integer.valueOf("123");         // 字符串转 Integer
Integer i3 = Integer.valueOf("1010", 2);     // 二进制字符串转 Integer
Integer i4 = Integer.valueOf("ff", 16);      // 十六进制字符串

⚠️ valueOf() 优于构造函数,因为它使用了缓存池(-128 到 127),性能更好。


✅ 2. 自动装箱与拆箱

// 自动装箱:int → Integer
Integer a = 100;        // 编译后:Integer.valueOf(100)

// 自动拆箱:Integer → int
int b = a;              // 编译后:a.intValue()

// 混合运算自动拆箱
Integer x = 5;
Integer y = 10;
int sum = x + y;        // 自动拆箱后相加

✅ 3. 字符串与 Integer 转换

字符串 → Integer / int

// 方法1:返回 int
int num1 = Integer.parseInt("123");

// 方法2:返回 Integer 对象
Integer num2 = Integer.valueOf("123");

// 指定进制
int bin = Integer.parseInt("1010", 2);     // 二进制 → 10
int hex = Integer.parseInt("ff", 16);      // 十六进制 → 255

Integer → 字符串

Integer i = 123;
String s1 = i.toString();
String s2 = Integer.toString(456);
String s3 = String.valueOf(i);

✅ 4. 进制转换

int num = 255;

// 转为不同进制字符串
String binary = Integer.toBinaryString(num);    // "11111111"
String octal  = Integer.toOctalString(num);     // "377"
String hex    = Integer.toHexString(num);       // "ff"

// 从字符串解析指定进制
int fromBin = Integer.parseInt("1111", 2);      // 15
int fromHex = Integer.parseInt("a1", 16);       // 161

✅ 5. 比较 Integer 对象

使用 compareTo()

Integer a = 100;
Integer b = 200;
int result = a.compareTo(b);  // 返回 -1, 0, 1

使用 equals()

Integer a = 100;
Integer b = 100;
System.out.println(a.equals(b));  // true(值比较)

// ❌ 错误方式:使用 == 比较对象
System.out.println(a == b);       // 可能 false(超出缓存范围时)

✅ 6. 获取 int 值(拆箱)

Integer i = 100;
int value = i.intValue();     // 显式拆箱

✅ 7. 位运算操作(实用技巧)

int n = 8;

// 判断是否为 2 的幂
boolean isPowerOfTwo = (n & (n - 1)) == 0 && n > 0;

// 获取最低位的 1
int lowBit = n & (-n);

// 计算二进制中 1 的个数
int count = Integer.bitCount(n);

// 反转字节顺序
int reversed = Integer.reverseBytes(n);

// 获取最高/最低 1 的位置
int highestOne = Integer.highestOneBit(n);  // 如 8 → 8
int lowestOne  = Integer.lowestOneBit(n);   // 如 12 → 4

三、常见错误与陷阱

❌ 1. 使用 == 比较 Integer 对象

Integer a = 128;
Integer b = 128;
System.out.println(a == b);  // false(超出缓存范围)
System.out.println(a.equals(b)); // true

✅ 正确做法:使用 equals() 比较值。

❌ 2. null 导致 NullPointerException

Integer num = null;
int value = num;  // 抛出 NPE(自动拆箱)

✅ 解决方案:

int value = (num != null) ? num : 0;
// 或使用
int value = Optional.ofNullable(num).orElse(0);

❌ 3. 字符串解析异常

Integer.parseInt("abc");  // 抛出 NumberFormatException

✅ 解决方案:使用 try-catch

try {
    int num = Integer.parseInt("abc");
} catch (NumberFormatException e) {
    System.err.println("无效数字格式");
}

四、注意事项

  1. 缓存范围Integer.valueOf() 缓存了 [-128, 127] 的实例,超出此范围会创建新对象。
  2. 不可变性:修改 Integer 值会创建新对象,原对象不变。
  3. 线程安全Integer 对象本身是线程安全的(不可变)。
  4. 泛型限制:集合不能存储基本类型,必须用 Integer
  5. 性能敏感场景:避免频繁装箱拆箱,尤其在循环中。

五、使用技巧

🔧 1. 判断奇偶性(位运算)

boolean isEven = (n & 1) == 0;

🔧 2. 快速乘除 2 的幂

n << 1;  // n * 2
n >> 1;  // n / 2(向下取整)

🔧 3. 交换两个整数(不用临时变量)

a ^= b;
b ^= a;
a ^= b;

🔧 4. 使用 Integer.compare() 避免溢出

// 安全比较,避免 (a - b) 溢出
int result = Integer.compare(a, b);

六、最佳实践

  1. 优先使用 Integer.valueOf() 而非 new Integer()
  2. 比较用 equals(),不要用 ==
  3. 避免在循环中频繁装箱拆箱
    // ❌ 低效
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < 10000; i++) {
        list.add(i); // 每次装箱
    }
    
    // ✅ 合理(但大数据量考虑用 int[])
    
  4. 处理 null 安全拆箱
  5. 字符串转整数使用 parseInt(),并捕获异常。
  6. 大量数值计算优先使用 int,避免对象开销。

七、性能优化建议

场景 建议
高频数值操作 使用 int 而非 Integer
集合存储 List<Integer> 是标准做法,但大数据考虑 TIntArrayList(来自 Trove)
缓存利用 利用 valueOf() 的缓存机制,小整数复用对象
循环中装箱 避免,可先用 int 计算完再装箱
位运算替代 <<, >>, & 替代乘除,提升性能

八、扩展:Integer 缓存机制源码简析

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
  • 缓存范围默认 [-128, 127],可通过 -XX:AutoBoxCacheMax=N 调整。
  • 适用于频繁使用的小整数,减少对象创建。

九、总结:快速记忆口诀

装箱用 valueOf,拆箱要防 null
比较用 equals,别用 == 犯迷糊
小数有缓存,大数 new 对象
字符串转 int,parse 要 try-catch
循环少装箱,性能才靠谱


十、附录:常用方法速查表

方法 说明
Integer.valueOf(int) 装箱(推荐)
Integer.parseInt(String) 字符串转 int
toString() 转字符串
compareTo(Integer) 比较大小
equals(Object) 值比较
bitCount(int) 二进制中 1 的个数
toBinaryString() 转二进制字符串
compare(int, int) 安全比较两个 int
reverseBytes(int) 字节反转