关于Integer.valueOf()用法。
public class Demo {
public static void main(String[] args) {
Integer i1=50;
int i2=50;
Integer i3=Integer.valueOf(50);
Integer i4= new Integer(50);
System.out.println(i1==i2);
System.out.println(i1==i3);
System.out.println(i3==i4);
System.out.println(i2==i4);
}
}
运行的结果,你知道吗?
比较i1与i2时:
选项A中比较的是i01和i02,Integer i01=59这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer 的引用。
而int i02=59由于int是基本类型,所以不存在引用问题,直接由编译器将其存放在栈中,换一句话说,i02本身就是59。那么System.out.println(i01== i02)结果任何呢?这里涉及到了拆箱的过程,因为等号一边存在基本类型所以编译器后会把另一边的Integer对象拆箱成int型,这时等号两边比较的就是数值大小,所以是true。
注意:
这个类就是在Integer类装入内存中时,会执行其内部类中静态代码块进行其初始化工作,做的主要工作就是把一字节的整型数据(-128-127)装包成Integer类并把其对应的引用存入到cache数组中,这样在方法区中开辟空间存放这些静态Integer变量,同时静态cache数组也存放在这里,供线程享用,这也称静态缓存。
所以当用Integer 声明初始化变量时,会先判断所赋值的大小是否在-128到127之间,若在,则利用静态缓存中的空间并且返回对应cache数组中对应引用,存放到运行栈中,而不再重新开辟内存。
所以对于Integer i01=59;Integer i02=59;i1 和 i2是引用并且相等都指向缓存中的数据,所以返回true。
对于这样:
Integer i1=300;
Integer i2=300;
System.out.println(i1==i2);
而对于i1=300;Integer i2=300;因为其数据大于127,所以虚拟机会在堆中重新new (开辟新空间)一个 Integer 对象存放300,创建2个对象就会产生2个这样的空间,空间的地址肯定不同导致返回到栈中的引用的值不同。所以System.out.println打印出false
比较i1与i3时:
首先要明确Integer.valueOf()这个函数的功能就是把int 型转换成Integer类型,其实是装箱。
若数值在-128到127范围,直接返回该对象的引用,否则在堆中重新new 一个。
比较i3和i4时:
Integer.valueOf(50)返回的是已缓存的对象的引用,而Integer i4 = new Integer(59)是在堆中新开辟的空间,所以二者的引用的值必然不同.
最后:
System.out.println(i2== i4) i2是整型变量,i4是引用,这里又用到了解包,虚拟机会把i4指向的数据拆箱为整型变量再与之比较,所以比较的是数值,50==50,返回true.
文章参考:https://blog.csdn.net/dawn_after_dark/article/details/74154338