java面试题:Integer常见面试题——详解

Integer常见面试题

1.介绍一下自动装箱和自动拆箱

  • java的八种基本类型都对应着相应的包装类型
  • 总的来说:装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。所以在运算赋值过程中,会自动进行拆箱和装箱。
  • 拆箱装箱的过程 :
    1)拆箱:Integer total = 99
    实际上是调用了Integer total = Integer.valueOf(99) 这句代码
    2)装箱:nt totalprim = total;
    实际上行是调用了 int totalprim = total.intValue();这句代码
  • 但是实际上拆箱装箱需要考虑常量池的存在!(下面会讲到)

2. Integer创建对象的几种方式和区别

  • 在JVM虚拟机中有一块内存为常量池,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值还,还包含一些以文本形式出现的符号引用
  • 对于基本数据,常量池对每种基本数据都有一个区间,在此区间中的数,都从常量池中存取共享!但是除了new创建对象的方式除外。

以Integer为例:

  • (-128——127为一个区间)
  • Integer total = 99
    这句赋值的确是会是自动装箱,但是返回的地址却不是在堆中,而是在常量池中,因为99属于【-128,,127】区间。也就是说以这种方式创建的对象,都是取的一个地址!
 		Integer t1 = 99;//常量池
        Integer t2 = 99;//常量池
        System.out.println(t1 == t2);//true  
  • Integer total = 128;
    这句赋值也会进行自动装箱,但是由于不在区间内,所以取到的对象地址是在堆中。不会进行对象共享!每次都会创建新的对象
 		Integer t3 = 128;//堆
        Integer t4 = 128;//堆
        System.out.println(t3 == t4);//false
  • Integer total = Integer.valueOf(99) ,Integer total= Integer.valueOf(128)
    这两种创建方式和上面的赋值是一样的,因为上面的自动装箱源码调用的就是这个方法!
   Integer tt1 = Integer.valueOf(99);//常量池
    Integer tt2 = Integer.valueOf(99);//常量池
    System.out.println(tt1 == tt2);//true  

    Integer tt3 = Integer.valueOf(128);//堆
    Integer tt4 = Integer.valueOf(128);//堆
    System.out.println(tt3 == tt4);//fasle  
  • Integer total = new Integer(99)
    使用new关键字创建对象的时候,就不需要考虑常量池的问题,无论数值大小,都从堆中创建!
		Integer n1 = new Integer(99);//堆
        Integer n2 = new Integer(99);//堆
        System.out.println(n1 == n2);//fasle
  • 总结:
    1)一共三种创建方式:
    前两种是看似不同,其实内部机制完全相同,因为会自动装箱!但是一定要注意到常量池的问题。
		Integer t1 = 99;//常量池
        Integer t4 = 128;//堆

        Integer tt2 = Integer.valueOf(99);//常量池
        Integer tt4 = Integer.valueOf(128);//堆
  

        Integer n1 = new Integer(99);//堆
        Integer n2 = new Integer(99);//堆

2)在面试过程中如果遇到考查Integer的情况,基本都会给一段代码,判断输出是true还是fasle,这时候只要仔细分析对象的创建方式,以及返回的地址来源即可!

3.常见考查代码

总结:

  1. 两个数都是用==或者Integer.valueOf()方法赋值的话,只要比较数的大小,在【-128,127】之间就相同,不在就不同
  2. 两个数都是用new关键字创建的话,无论数值大小,一定不同
  3. 一个数用new,一个数用==或者Integer.valueOf(),也一定不同!
Integer in= new Integer(127);
Integer in2 = new Integer(127);
System.out.println(in==in2);//false
System.out.println(in.equals(in2));//true


Integer in3= new Integer(128);
Integer in4 = new Integer(128);
System.out.println(in3==in4);//false
System.out.println(in3.equals(in4));//true


Integer in5= 128;
Integer in6 = 128;
System.out.println(in5==in6);//false
System.out.println(in5.equals(in6));//true


Integer in7= 127;
Integer in8 = 127;
System.out.println(in7==in8);//true
System.out.println(in7.equals(in8));//true
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值