请说明 Java 中包装类型与基本类型在默认值、存储位置、比较方式、使用场景和性能开销等方面的主要区别。
考察说明
考察对 Java 基本类型与引用类型底层差异的理解,以及实际编码时的取舍能力。
回答思路
- 【回答框架 1】基本类型直接存值,包装类型是对象,存引用;默认值不同,基本类型如 int 默认 0,包装类型如 Integer 默认 null。
- 【回答框架 2】存储位置不同:基本类型通常在栈上(局部变量),包装类型对象在堆上,引用在栈;比较时基本类型用 == 比较值,包装类型用 equals 比较值,== 比较引用。
- 【回答框架 3】自动装箱拆箱由编译器在字节码层完成,如 Integer.valueOf 有缓存机制(-128 到 127),但超出范围每次 new 新对象,比较需注意。
- 【回答框架 4】使用场景:泛型、集合、反射必须用包装类型,性能敏感或数值运算时优先基本类型,避免频繁装箱拆箱开销。
- 【回答框架 5】实际方案中,需明确空安全:包装类型可表达 null 区别于 0,但解引用会 NPE,需结合 Optional 或判空处理。
- 【关键点 1】基本类型存值,包装类型存引用且可 null;默认值分别为 0 和 null。
- 【关键点 2】包装类型在堆上,基本类型局部变量在栈上。
- 【关键点 3】值比较:基本类型用 ==,包装类型用 equals,== 用于引用比较。
- 【关键点 4】自动装箱拆箱有缓存和性能开销,需权衡使用场景。
- 【易错点 1】误用 == 比较包装类型值,尤其超出缓存范围时结果不一致。
- 【易错点 2】忽略包装类型可能为 null 导致自动拆箱时 NPE。
- 【易错点 3】频繁装箱拆箱造成性能损耗,在循环或计算密集处应避免。