很经典的两道关于数字类型面试的题目
一、两个数字之间的==的比较输出的结果
在控制台打印的结果 true和false.
为什么两个数字相等,却有不一样的结果。这里考察的知识点是
1.==比较的是什么?
2.Integer的缓存范围,或者说内部机制?
3.jvm内部原理?
先从第一个回答起,==对于基本类型的比较(8大基本类型),比较的是两个‘值’是否相等。而对于引用类型,比较的则是所指向对象的地址。
第二个问题回答,Integer本身是一个包装类型(包装类型属于引用类型),而非基本类型。Integer内部在对数值进行装箱操作时,会判断该数字是否在-128~127之间,如果在这之间会将其放入IntegerCache中(详情追查源码)。如果定义一个数时,例如第一种情况则只会有一个数字的地址。第二种超过范围情况则会有两个数字。
第三个回答,JVM在我们创建对象时,会先在栈(stack)中创建对象名(a,b等),再在堆(heap)中创建对象值(1,128等)。而堆中值的地址会指向栈中对象,c语言中是用指针来完成这一过程。而java则内部处理了。
综上我们可以理解,a和b的==比较,就是包装类型(引用类型)指向对象地址的比较。当Integer在-128-127之间会缓存数字,即只有一个地址则比较结果为true。超过这个范围,在jvm堆中产生两个不同对象值,比较结果为false.
二、两个不同的引用类型(数字)的转换。
一般遇到交换两个值,我们首先想到的是中间变量来处理这件事。但这里要求的是一种方法交换两个数字的值,我们可以将其理解为一个工具类。而简单换两个值,利用中间变量,并不能返回结果,所以这里不成立。
深入理解值赋予变量(一般是包装类型),要么是值的互换,或者引用地址的互换。在这里考察的是引用地址的交换。
在这里考察的知识点:
1、反射(reflect)
2、JVM内部变量的原理。