上图来自《Algorithms4》上的知识点,当弄明白1,3段代码为啥输出true/false时,笔试这个知识点就掌握了,第一段代码输出true,第三段输出false。是因为Java存在一个检索缓存的机制,当一个Integer对象的值在[-128,127]之间时,自动装箱另一个相同值的Integer对象时不会新建对象,而是使装箱变量指向已存在的Integer对象。超过该范围,则会新建立一个Integer对象。为此第一段运行结果为true,第三段代码运行结果为false。obviously,这样做的好处就是利用缓存机制节省内存空间,因为通常[-128,127]区间内的Integer对象引用是programmer最常用的。
顺带解释一下,为何存在拆装箱的机制。因为某些类或者类中的实例函数需要传递的参数只能为对象,而基础数据类型如整数int不是一个对象,不能直接传递到函数作为实参,为此java为每一个基础数据类型设计了对应的对象引用类型,通过自动拆装箱来完成基础数据类型和对象引用类型的自动转换,很人性化。