一文弄懂Integer值相等问题

Integer相等问题

B站视频讲解点这里

场景一:

Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a.equals(b));  // true

如果是equals比较的话,我们只需要去看value值是否相等

在这里插入图片描述

场景二:

Integer c = new Integer(10);
Integer d = new Integer(10);
System.out.println(c == d);    // false

如果说是 == 比较的话,那么调用new Integer() 这个构造方法的话,那么一定不等

场景三:

Integer e = 10; // 自动装箱   Integer e = Integer.valueOf(10);
Integer f = 10;
System.out.println(e == f);

如果说,创建方式采用自动装箱,那么你传进来的值,是在缓存数组的范围内,那么给你返回的是常量池中的对象,如果不在,那么新创建对象,

所以,值在-128到127之间,那么 == 的结果是ture,否则,是false

在这里插入图片描述

我们在看valueOf的源码
在这里插入图片描述

再去看一下常量池的源码,注意的点都写在了注释中

在这里插入图片描述

常量池可以通过改变VM参数,调整大小

Integer g = 300;
Integer h = 300;
System.out.println(g==h); //true
// -XX:AutoBoxCacheMax=300 通过改变JVM的参数,使得相等

为什么要设计常量池:

  1. 节约内存,不管你要创建多少个常量池范围内的对象,我只需要去创建常量池大小的对象个数
  2. 提高效率,对象创建是一个费时操作,提前创建好后,只需要去数组中取就行了,速度更快

常量池的设计采用了享元模式,这种模式,可以帮助我们复用对象,节省内存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值