当前位置: 首页 > >

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.常见考查代码

总结:


    两个数都是用==或者Integer.valueOf()方法赋值的话,只要比较数的大小,在【-128,127】之间就相同,不在就不同两个数都是用new关键字创建的话,无论数值大小,一定不同一个数用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



友情链接: