推荐用 Objects.nonNull() 判断非空,语义清晰;Objects.equals() 避免空指针且处理包装类相等性;Objects.hashCode() 处理单对象,Objects.hash() 组合多值;Objects.toString() 默认返"null",可自定义。

Objects.nonNull() 和 Objects.isNull() 怎么选
直接用 Objects.nonNull() 判断非空更符合主流写法,语义清晰且与 if 逻辑自然对齐;Objects.isNull() 虽然存在,但容易引发双重否定困惑(比如 !Objects.isNull(x)),多数场景没必要绕一圈。
- 推荐写法:
if (Objects.nonNull(obj)) { ... } - 避免嵌套否定:
if (!Objects.isNull(obj))—— 这和直接用nonNull等价,但多了一层理解成本 - 注意:这两个方法只做
null检查,不递归检查对象内部字段
Objects.equals() 为什么比 == 和 obj.equals() 更安全
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.hash() 和 Objects.hashCode() 的区别在哪
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() 的默认值陷阱
Objects.toString(obj) 在 obj 为 null 时返回字符串 "null";而 Objects.toString(obj, nullValue) 允许指定替代值,但第二个参数本身可以为 null,此时仍返回 "null" 字符串 —— 这点容易误解。
立即学习“Java免费学习笔记(深入)”;
-
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()。










