Java包装类与128陷阱:你必须知道的细节

一、包装类基础概念

1. 基本类型与包装类对应关系

基本类型 包装类 缓存范围
byte Byte -128 ~ 127
short Short -128 ~ 127
int Integer -128 ~ 127
long Long -128 ~ 127
float Float 无缓存
double Double 无缓存
char Character 0 ~ 127
boolean Boolean true/false

 2. 自动装箱与拆箱机制

// 自动装箱(Autoboxing)
Integer a = 100;  // 实际执行 Integer.valueOf(100)

// 自动拆箱(Unboxing)
int b = a;       // 实际执行 a.intValue()

3. 缓存机制原理

Java对常用范围的包装类对象进行缓存优化:

  • Integer默认缓存-128~127

  • 新创建对象时,优先返回缓存实例

  • 使用valueOf()方法触发缓存机制

 二、128陷阱深度解析

1.举个例子

public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        Integer a1 = 10;
        Integer b1 = 10;
        Integer a2 = new Integer(10); // 修正语法错误
        Integer b2 = new Integer(10);
        
        System.out.println(a == b);    // true
        System.out.println(a1 == b1);  // true
        System.out.println(a2 == b2);  // false
        System.out.println(a1 == a);   // true
    }
}

2.基本类型与包装类比较规则

比较场景 比较方式 结果判断依据
基本类型 vs 基本类型 == 值是否相等
包装类 vs 包装类 == 内存地址是否相同
包装类 vs 基本类型 == 自动拆箱后比较值

Java包装类与128陷阱:你必须知道的细节_第1张图片

3.代码逐行解析 

1. int a = 10; int b = 10;

  • 存储位置:栈内存

  • 比较方式a == b 直接比较值

  • 结果true(值相等)

2. Integer a1 = 10; Integer b1 = 10;

  • 自动装箱过程Integer.valueOf(10)

  • 内存分配:使用缓存对象(-128~127)

  • 比较方式a1 == b1 比较对象地址

  • 结果true(指向同一个缓存对象)

3. Integer a2 = new Integer(10);

  • 显式创建对象:强制在堆中分配新内存

  • 比较方式a2 == b2 比较对象地址

  • 结果false(两个独立对象)

4. a1 == a

  • 自动拆箱机制:将Integer转换为int

  • 比较方式a1.intValue() == a

  • 结果true(值相等)

4.其他包装类缓存范围

包装类 缓存范围 实现方式
Byte -128 ~ 127 全范围缓存
Short -128 ~ 127 部分实现缓存
Long -128 ~ 127 同Integer
Character 0 ~ 127 ASCII字符缓存
Boolean TRUE/FALSE 仅两个实例

三、总结要点 

  1. 缓存机制:-128~127的Integer对象自动复用

  2. 对象创建new强制创建新对象,valueOf()使用缓存

  3. 比较原则

    • 包装类间比较必须用equals()

    • 基本类型与包装类比较自动拆箱

  4. 性能影响:高频自动装箱/拆箱操作需优化

  5. 空值处理:包装类使用前必须判空

你可能感兴趣的:(java,开发语言,包装类)