在Java里如何比较两个变量是否相等_Java比较运算规则说明

Java中比较变量相等需区分值相等与引用相等:基本类型用==比较值,引用类型优先用equals()比较内容,避免直接用==;包装类因缓存机制导致==结果不可靠;自定义类须重写equals()和hashCode()。

Java中比较两个变量是否相等,关键在于区分“值相等”和“引用相等”,并根据变量类型(基本类型或引用类型)选择合适的方式。

基本类型用 == 比较值

int、double、char、boolean 等基本类型变量,直接用 == 判断数值是否相同:

  • == 对基本类型比较的是实际存储的值
  • 例如:int a = 5; int b = 5;a == b 返回 true
  • 注意:浮点数(float/double)用 == 比较可能存在精度问题,建议用 Math.abs(a - b) 判断近似相等

引用类型慎用 ==,优先用 equals()

String、Integer、ArrayList 等引用类型,== 比较的是两个变量是否指向**同一个对象(内存地址)**,不是内容是否相同:

  • String s1 = "hello"; String s2 = "hello";s1 == s2 可能

    true(字符串常量池优化)
  • String s1 = new String("hello"); String s2 = new String("hello");s1 == s2 一定为 false
  • 要比较内容是否一致,应调用 .equals() 方法:s1.equals(s2) 返回 true
  • 使用前建议判空,避免 NullPointerException:Objects.equals(s1, s2) 更安全

包装类的特殊性:== 在小整数范围内可能“碰巧”成立

Integer、Byte、Character 等包装类有缓存机制(如 Integer 缓存 -128 ~ 127),导致部分值用 == 比较会返回 true,但这不是可靠行为:

  • Integer a = 100; Integer b = 100;a == btrue(命中缓存)
  • Integer c = 200; Integer d = 200;c == d 很可能是 false(超出缓存范围)
  • 始终用 .equals()Objects.equals() 判断逻辑相等,不依赖 ==

自定义类要重写 equals() 和 hashCode()

如果自己写的类需要按业务字段判断是否相等,必须重写 equals() 方法(通常也需同步重写 hashCode()):

  • 默认继承自 Object 的 equals() 等价于 ==,只比地址
  • 重写后可按 id、name 等字段组合判断,例如:return Objects.equals(this.id, other.id) && Objects.equals(this.name, other.name);
  • 若该类对象会放入 HashMap / HashSet,未重写 hashCode() 会导致逻辑异常