面试官问我为什么Integer a = (128) != Integer b (128) 装箱拆箱及IntegerCache问题

前言

基本数据类型与包装类型:

什么是基本数据类型?什么是包装类型?

装箱拆箱

什么是装箱?什么是拆箱?

怎么进行装箱的?

为什么这样设计?

如何进行拆箱

有了基本数据类型为什么还要有包装类型?

包装类的缓存机制

总结


前言

在面试的时候面试官给我了几行代码如下:

面试官: 下面输出的结果是什么?

我: 第一个 true , 第二个 false;

面试官: 为什么?

我: ???????

public class Demo1 {
    public static void main(String[] args) {
        Integer i1 = 127;
        Integer i2 = 127;

        Integer i3 = 128;
        Integer i4 = 128;

        System.out.println(i1 == i2); // true
        System.out.println(i3 == i4); // false
    }
}

 

接下来我们看着源码刨析下这个问题以及该从哪些方面回答。


基本数据类型与包装类型:

什么是基本数据类型?什么是包装类型?

基本数据类型:

java中有八大数据类型:byte、sort、char、int、long、float、double、boolean。

它们默认值分别是:0,0,'_',0,0,0.0,0.0,false.

包装类型:

每一个基本数据类型都对应一个包装类型:

byte - Byte / sort - Sort / char - Character / int - Integer / long - Long / float - Float / double - Double / boolean - Boolean

它们默认值都是: null


装箱拆箱

什么是装箱?什么是拆箱?

装箱是基本数据类型转换成对应的包装类型。(通过 valueOf( ) 方法进行转换)

public class Demo2 {
    public static void main(String[] args) {
        Integer i = new Integer(127); // 装箱
        Integer i1 = Integer.valueOf(127); // 装箱
        Integer i2 = 127; // 装箱

        System.out.println("i: " +i.hashCode()); // 127
        System.out.println("i1: " +i1.hashCode()); //127
        System.out.println("i3: " + i2.hashCode()); //127
        System.out.println(i1 == i); // false
        System.out.println(i == i2); // false
        System.out.println(i2 == i1); //true
    }
}

拆箱是包装类型转换成对应的基本数据类型。  (通过 x.xxxValue() 方法进行拆箱)

public class Demo3 {
    public static void main(String[] args) {
        Integer it = 127;
        int i1 = it;
        int i2 = it.intValue();

        System.out.println(it == i1); // true
        System.out.println(it == i2); // true
        System.out.println(i1 == i2); // true
    }
}

 

怎么进行装箱的?

一、Integer i1 = new Integer();

我们以 Integer 为例:

 这种装箱方式在堆区开辟空间,所以两个不一样的对象地址不同返回false,没有使用到IntegerCa

che

源码: 直接将 int 值赋值操作并创建对象。

 二、Integer i1 = 127;

为什么第一个输出 true,而第二个输出 false 呢?

看下源码:

我们可以了解到这种方式装箱通过  valueOf的方式进行创建一个 Integer 对象,并使用了一个 IntegerCache 整形缓存来进行了一次比较,这个是什么呢?

我们再查看下源码可知:

IntegerCache 是一个Integer 类型的数组,数值范围再 -128 - 127 之间,如果装箱的数值在这个范围内,直接返回这个对象,否则创建一个新的对象。

为什么这样设计?

设计者认为我们使用的数值大部分是100 以内,为了节省内存资源的消耗,频繁创建对象的性能消耗,所以指定了这个规则。

如何进行拆箱

以 Integer 类型为例:通过 intValue( ) 进行装箱操作

我们看下源码:

 

 

 

 我们可以知道,包装类型底下还是保存一个 int ,并且被 final 修饰保证安全。


有了基本数据类型为什么还要有包装类型?

面试官: 包装类型存在的意义是什么?

我:

java是面向对象的语言,我们操作的一切其实都是对象,比如在集合类中,我们只能操作对象,这时候基本类型就不适用了,对基本类型提供对象类,可以增加对基本类型的操作,实现更多的功能。


包装类的缓存机制

面试官:那可以再解释一下包装类的缓存机制么?

我: 缓存机制是为了节省内存,降低性能消耗的一种方法,在规定的范围内可以直接调用同一对象而不去重新创建。不是所有的包装类型都有缓冲机制如 Byte、short、Integer、Character、Long具有缓存机制,范围都是 -128 - 127。当需要频繁的使用同一对象的时候,如果有缓存,则可以避免重复创建同一对象,节省空间开销和时间消耗,提升了性能。

面试官:50w年薪明天来上班!


总结

面对这个问题的时候,我们先看着代码给出结果,随着面试官的深入,解释为什么会存在包装类型及区别如默认值,及包装类的缓存机制及存在的价值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极品小學生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值