Java关系运算符行为由操作数类型决定:基本类型直接比较值,如5==5为true、'a'<2.99为true、true==false为false;float/double相等判断应避免==而用Math.abs(a-b)。

Java 中的关系运算符(==、!=、<、>、<=、>=)本身不区分“数值”或“对象”,而是严格按操作数类型决定行为——关键在于你拿什么去比,而不是运算符想怎么比。
基本数据类型:直接比值
对 int、double、char、boolean 等基本类型,关系运算符一律比较实际内容:
-
5 == 5→true(整数相等) 'a' → <code>true(char 按 Unicode 值比较)-
3.14 > 2.99→true(浮点数比大小,但注意精度问题) -
true == false→false(boolean 只能和 boolean 比)
⚠️ 注意:float 和 double 不建议用 == 判断相等,应改用 Math.abs(a - b) 。
引用数据类型:默认比地址,不是比内容
对 String、Integer、自定义类等引用类型,== 和 != 比较的是两个变量是否指向**堆内存中的同一对象**:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
String s1 = "abc"; String s2 = "abc"; s1 == s2→true(字符串常量池优化) -
String s3 = new String("abc"); s1 == s3→false(不同对象,地址不同) -
Integer a = 100; Integer b = 100; a == b→true(自动装箱缓存 -128~127) -
Integer c = 200; Integer d = 200; c == d→false(超出缓存范围,新建对象)
⚠️ <、>、<=、>= 不能用于任意引用类型——编译直接报错。它们只允许用于数值类型(含 char)和包装类(如 Integer、Double),且要求有明确的自然序。
想比内容?别用 ==,改用专门方法
关系运算符无法替代语义比较。要判断两个对象“逻辑上是否相等”或“谁大谁小”,必须使用约定好的 API:
- 判相等 → 调用
.equals()(String、Integer 等已重写;自定义类需自己重写) - 比大小 → 实现
Comparable接口并重写compareTo(),或传入Comparator - 字符串字典序比较可直接用
str1.compareTo(str2),返回负数/0/正数
例如:"hello".equals("Hello") → false(区分大小写),而 "hello".equalsIgnoreCase("Hello") → true。
包装类的特殊混合比较
当基本类型和其包装类混用时(如 int 和 Integer),Java 会自动拆箱再比较:
-
Integer x = 5; System.out.println(x == 5);→true(x 拆箱为 int 后比较) -
Integer y = null; System.out.println(y == 5);→ 运行时报NullPointerException
所以涉及可能为 null 的包装类时,务必先判空,或统一用 Objects.equals(a, b) 安全比较。

















