基本数据类型int的包装类Integer中的Integer.valueOf()方法

关于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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值