Java知识点收集(一)

一、问题

在基本类型int中,根据面向对象的思维,它有对应的Integer包装类型,里面定义了操作该基本类型的属性和方法。当使用“==”去比较两个int类型的数时,在开发环境下比较的结果是正确的,但在实际生成环境下,比较的结果是错误的。

二、原因

在JVM中,根据享元模式的设计结构,Java运行时系统对Integer对象的缓存是通过一个叫做IntegerCache的内部类来实现的。IntegerCache是在Integer类中的私有静态内部类,它缓存了一个范围内的Integer对象,这个范围可以通过参数进行配置。在Java 8中,默认情况下,IntegerCache缓存了-128到127之间的Integer对象。这意味着在这个范围内创建的Integer对象可以被重用,而不需要重新创建新的对象。所以如果参与比较的两个数刚好落在这个范围(如 2 和 2 比较),使用==返回是true,如果是128 与128用==比较,则结果为false。而实际生产环境的数值远远大于这个一级缓存范围,所以即时两个数相同使用==也会出现错误。

IntegerCache只是对于自动装箱(Autoboxing)操作有效。当我们使用直接赋值的方式创建Integer对象时,并不会利用IntegerCache。例如,通过Integer i = 200;创建的Integer对象并不会使用IntegerCache中的缓存。但是,当使用Integer.valueOf()方法创建Integer对象时且只有当数值落在这个范围内时才会直接返回缓存中的对象。

三、解决方法

使用包装类中的比较方法equlas()或compareTo()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值