编程后端开发

解释一下Java中autoboxing和unboxing机制是如何工作的,它有哪些风险,以及它可能导致的性能或逻辑错误。

用 Hintsage AI 助手通过面试

答案。

Autoboxing 是指将基本类型(如intdouble等)自动转换为相应的包装对象(如IntegerDouble等)。Unboxing 是指将包装对象反转为基本类型的操作。

它在赋值、方法参数和集合中自动工作:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // autoboxing示例:5 (int) -> Integer(5) int value = numbers.get(0); // unboxing:Integer(5) -> 5

风险:

  • 在unboxing为null时可能会发生NullPointerException;
  • 由于不断创建包装对象,导致内存和时间的低效使用;
  • 与==(引用比较)和equals的比较存在复杂性。

反向问题。

以下代码会抛出异常吗?为什么?

Integer x = null; int y = x;

答案: 该代码抛出NullPointerException,因为在执行int y = x;时,发生了从null到基本类型的unboxing,而null无法转换为int

由于对主题细节不了解而导致的实际错误示例。


故事

在包装Integer的集合中计算总和。每次总和增加时,都会创建一个新的Integer对象,导致在实际服务器上出现显著的延迟,而不是使用int

故事

程序员将Integer用作缓存的键,未考虑到-128...127的值会被缓存,而其他值则不会。因此,==突然开始返回错误的结果,导致数据从缓存中错误地删除。

故事

在REST API中收到可为null的值。简单的unboxing传入的Integer有时会因为意外的null而导致崩溃,而不是客户端发送的数字。