推荐用 Objects.nonNull() 判断非空,语义清晰;Objects.equals() 避免空指针且处理包装类相等性;Objects.hashCode() 处理单对象,Objects.hash() 组合多值;Objects.toString() 默认返"null",可自定义。
直接用 Obje 判断非空更符合主流写法,语义清晰且与 
if 逻辑自然对齐;Objects.isNull() 虽然存在,但容易引发双重否定困惑(比如 !Objects.isNull(x)),多数场景没必要绕一圈。
if (Objects.nonNull(obj)) { ... }
if (!Objects.isNull(obj)) —— 这和直接用 nonNull 等价,但多了一层理解成本null 检查,不递归检查对象内部字段Objects.equals(a, b) 内部已处理任一参数为 null 的情况,不会抛 NullPointerException,而直接调用 a.equals(b) 在 a 为 null 时必然崩溃。
a == b:仅比较引用,基本类型包装类(如 Integer)在 -128~127 外会返回 false 即使值相等a.equals(b):若 a 为 null,运行时报错Objects.equals(a, b):先判空再委托 equals,安全且简洁String a = null; String b = "hello"; System.out.println(Objects.equals(a, b)); // false,不抛异常 System.out.println(a.equals(b)); // NullPointerException
Objects.hashCode(obj) 是对单个对象调用 obj.hashCode() 的空安全封装;Objects.hash(values...) 是对多个值(可含 null)统一计算哈希码,常用于重写 hashCode() 方法。
Objects.hashCode(null) 返回 0;Objects.hashCode("abc") 等价于 "abc".hashCode()
Objects.hash(name, age, address) 相当于手动实现:先对每个参数调用 Objects.hashCode(),再按固定算法组合Objects.hash(obj) 和 Objects.hashCode(obj) 结果不同 —— 前者把整个对象当一个元素传入可变参数,后者是直接取该对象哈希值Objects.toString(obj) 在 obj 为 null 时返回字符串 "null";而 Objects.toString(obj, nullValue) 允许指定替代值,但第二个参数本身可以为 null,此时仍返回 "null" 字符串 —— 这点容易误解。
Objects.toString(null) → "null"
Objects.toString(null, "N/A") → "N/A"
Objects.toString(null, null) → "null"(不是 NullPointerException,也不是 null 引用)null 且需日志/展示,优先用带默认值的重载,避免输出字面量 "null"
Objects 方法都不处理“逻辑空”,比如空字符串、空集合、数值 0。它们只响应 Java 层面的引用 null。业务中常要组合使用,例如 Objects.nonNull(str) && !str.trim().isEmpty()。