《java基础》整型包装类之间值得比较

问题的起源

事情的起源是上周公司的一个实习生写出的一个BUG,本来没打算写一篇文章的,可是这周我发现另一个实习生也重蹈覆辙。所有想把这个问题分享给各位小白。话不多说直接上问题代码。

问题代码


/**
 * 该代码是我模拟的问题代码。
 */
public class Demo {

  public static void main(String[] args) {
    // 定义两变量
    Integer num1 = 128;
    Integer num2 = 128;
    // 进行比较
    if(num1 == num2){
      System.out.println("num1等于num2");
    } else {
      System.out.println("num1不等于num2");
    }
  }
  
}

那么请问是输出相等还是不等那??
在这里插入图片描述


解决方案

先保留疑问我先提供解决方案。


  public static void main(String[] args) {
    // 定义两变量
    Integer num1 = 128;
    Integer num2 = 128;
    // 解决方法特别简单我们将==换成equals()方法,此时问题迎刃而解。
    if(Objects.equals(num1, num2)){
      System.out.println("num1等于num2");
    } else {
      System.out.println("num1不等于num2");
    }
  }
解惑

有没有人很不解?明明看着相同的两个数为什么不同那?其实很简单,java中 == 比较的是地址值。当Integer的值在-128至127之间时,Integer对象是在IntegerCache.cache中产生会复用已有对象。当超过这个范围时产生的对象是在堆内存中,就不会复用已有的对象。所以用 == 比较就会出现问题。建议大家使用整形包装类比较时统一都使用equals方法。

在这里插入图片描述

欲戴王冠,必承其重。哪有什么好命天赐,不都是一路披荆斩棘才换来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值