## Java `java.util.Objects` 常用方法整理表 | **方法名** | **参数** | **返回类型** | **功能描述** | **示例** | | ----------------------- | ------------------------------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | | **空值检查** | | | | | | `isNull` | `(Object obj)` | `boolean` | 检查对象是否为 null | `Objects.isNull(null)` → `true` | | `nonNull` | `(Object obj)` | `boolean` | 检查对象是否非 null | `Objects.nonNull("abc")` → `true` | | `requireNonNull` | `(T obj)` | `T` | 检查对象非 null,否则抛 NPE | `Objects.requireNonNull(str)` | | `requireNonNull` | `(T obj, String message)` | `T` | 检查非 null,可定制异常消息 | `Objects.requireNonNull(param, "Param must not be null")` | | `requireNonNull` | `(T obj, Supplier messageSupplier)` | `T` | 检查非 null,异常消息延迟计算 | `Objects.requireNonNull(obj, () -> "Error: " + calcError())` | | **对象比较** | | | | | | `equals` | `(Object a, Object b)` | `boolean` | 安全的空值比较(防止 NPE) | `Objects.equals(null, null)` → `true` | | `deepEquals` | `(Object a, Object b)` | `boolean` | 支持数组的深层比较 | `Objects.deepEquals(arr1, arr2)` | | **对象工具** | | | | | | `hash` | `(Object... values)` | `int` | 为对象数组生成哈希值 | `Objects.hash(name, age, address)` | | `hashCode` | `(Object o)` | `int` | 安全的哈希值计算 | `Objects.hashCode(null)` → `0` | | `toString` | `(Object o)` | `String` | 安全调用 toString() | `Objects.toString(null)` → `"null"` | | `toString` | `(Object o, String nullDefault)` | `String` | 带默认值的 toString() | `Objects.toString(obj, "N/A")` | | `compare` | `(T a, T b, Comparator c)` | `int` | 安全的比较操作 | `Objects.compare(s1, s2, String.CASE_INSENSITIVE_ORDER)` | | **类型检查** | | | | | | `requireNonNullElse` | `(T obj, T defaultObj)` | `T` | 获取对象或默认值 | `Objects.requireNonNullElse(input, DEFAULT_INPUT)` | | `requireNonNullElseGet` | `(T obj, Supplier supplier)` | `T` | 获取对象或生成默认值 | `Objects.requireNonNullElseGet(cache, () -> fetchDefault())` | | **范围检查** | | | | | | `checkIndex` | `(int index, int length)` | `int` | 检查索引在范围内 | `Objects.checkIndex(2, list.size())` | | `checkFromToIndex` | `(int fromIndex, int toIndex, int length)` | `int` | 检查起止索引范围 | `Objects.checkFromToIndex(0, 3, arr.length)` | | `checkFromIndexSize` | `(int fromIndex, int size, int length)` | `int` | 检查位置+大小范围 | `Objects.checkFromIndexSize(5, 10, buffer.length)` | ## 主要功能详解 #### 1. 空值安全操作 ```java // 安全比较(避免 NullPointerException) boolean isEqual = Objects.equals(firstObj, secondObj); // 安全哈希值计算 int hashCode = Objects.hash(name, age, address); // 安全 toString() String info = Objects.toString(user, "User not available"); ``` #### 2. 空值检查与默认值 ```java // 非空检查(失败时抛出 NullPointerException) Connection conn = Objects.requireNonNull(connection); // 带自定义错误信息的非空检查 Config config = Objects.requireNonNull(loadedConfig, "Configuration must be loaded"); // 提供默认值 DataProcessor processor = Objects.requireNonNullElse( customProcessor, DefaultProcessor.INSTANCE ); // 延迟生成默认值 Cache cache = Objects.requireNonNullElseGet( userCache, () -> createDefaultCache() ); ``` #### 3. 范围验证 ```java // 验证数组索引 int validIndex = Objects.checkIndex(index, array.length); // 验证子列表范围 int fromIndex = Objects.checkFromToIndex(start, end, collection.size()); // 验证缓冲区操作范围 int position = Objects.checkFromIndexSize(offset, length, buffer.capacity()); ``` ## 使用场景建议 1. **空值安全操作**: ```java // 传统方式(可能抛 NPE) if (user.getProfile().getName().equals("admin")) { ... } // 安全的 Objects.equals if (Objects.equals(user.getProfile().getName(), "admin")) { ... } ``` 2. **安全的哈希计算**: ```java // 传统方式需要处理每个对象的 null 检查 int hash = name != null ? name.hashCode() : 0; hash = 31 * hash + (age != null ? age.hashCode() : 0); // Objects.hash 简化写法 public int hashCode() { return Objects.hash(name, age, address); } ``` 3. **配置项验证**: ```java public void configure(AppConfig config) { this.config = Objects.requireNonNull(config, "AppConfig must not be null"); this.timeout = Objects.requireNonNullElseGet( config.getTimeout(), () -> Duration.ofSeconds(30) ); } ``` 4. **集合操作**: ```java public void processSublist(List> list, int from, int to) { int start = Objects.checkFromToIndex(from, to, list.size()); List> sub = list.subList(start, to); // 安全的处理子列表 } ``` ## 特性对比 | **功能** | **传统方式** | **Objects 方式** | | ------------ | --------------------------------- | ---------------------------------- | | **空值比较** | 需前置 null 检查 | `Objects.equals(a,b)` | | **哈希计算** | 需处理每个字段的 null 检查 | `Objects.hash(f1,f2,f3)` | | **空值验证** | `if (obj == null) throw...` | `Objects.requireNonNull(obj)` | | **索引验证** | `if (index < 0 or index >= size)` | `Objects.checkIndex(index, size)` | | **默认值** | 三目运算符 | `requireNonNullElse(obj, default)` | 使用 Objects 类能显著提高代码的健壮性和可读性,特别是在处理可能为 null 的对象时。 Loading... ## Java `java.util.Objects` 常用方法整理表 | **方法名** | **参数** | **返回类型** | **功能描述** | **示例** | | ----------------------- | ------------------------------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | | **空值检查** | | | | | | `isNull` | `(Object obj)` | `boolean` | 检查对象是否为 null | `Objects.isNull(null)` → `true` | | `nonNull` | `(Object obj)` | `boolean` | 检查对象是否非 null | `Objects.nonNull("abc")` → `true` | | `requireNonNull` | `(T obj)` | `T` | 检查对象非 null,否则抛 NPE | `Objects.requireNonNull(str)` | | `requireNonNull` | `(T obj, String message)` | `T` | 检查非 null,可定制异常消息 | `Objects.requireNonNull(param, "Param must not be null")` | | `requireNonNull` | `(T obj, Supplier<String> messageSupplier)` | `T` | 检查非 null,异常消息延迟计算 | `Objects.requireNonNull(obj, () -> "Error: " + calcError())` | | **对象比较** | | | | | | `equals` | `(Object a, Object b)` | `boolean` | 安全的空值比较(防止 NPE) | `Objects.equals(null, null)` → `true` | | `deepEquals` | `(Object a, Object b)` | `boolean` | 支持数组的深层比较 | `Objects.deepEquals(arr1, arr2)` | | **对象工具** | | | | | | `hash` | `(Object... values)` | `int` | 为对象数组生成哈希值 | `Objects.hash(name, age, address)` | | `hashCode` | `(Object o)` | `int` | 安全的哈希值计算 | `Objects.hashCode(null)` → `0` | | `toString` | `(Object o)` | `String` | 安全调用 toString() | `Objects.toString(null)` → `"null"` | | `toString` | `(Object o, String nullDefault)` | `String` | 带默认值的 toString() | `Objects.toString(obj, "N/A")` | | `compare` | `(T a, T b, Comparator<T> c)` | `int` | 安全的比较操作 | `Objects.compare(s1, s2, String.CASE_INSENSITIVE_ORDER)` | | **类型检查** | | | | | | `requireNonNullElse` | `(T obj, T defaultObj)` | `T` | 获取对象或默认值 | `Objects.requireNonNullElse(input, DEFAULT_INPUT)` | | `requireNonNullElseGet` | `(T obj, Supplier<T> supplier)` | `T` | 获取对象或生成默认值 | `Objects.requireNonNullElseGet(cache, () -> fetchDefault())` | | **范围检查** | | | | | | `checkIndex` | `(int index, int length)` | `int` | 检查索引在范围内 | `Objects.checkIndex(2, list.size())` | | `checkFromToIndex` | `(int fromIndex, int toIndex, int length)` | `int` | 检查起止索引范围 | `Objects.checkFromToIndex(0, 3, arr.length)` | | `checkFromIndexSize` | `(int fromIndex, int size, int length)` | `int` | 检查位置+大小范围 | `Objects.checkFromIndexSize(5, 10, buffer.length)` | ## 主要功能详解 #### 1. 空值安全操作 ```java // 安全比较(避免 NullPointerException) boolean isEqual = Objects.equals(firstObj, secondObj); // 安全哈希值计算 int hashCode = Objects.hash(name, age, address); // 安全 toString() String info = Objects.toString(user, "User not available"); ``` #### 2. 空值检查与默认值 ```java // 非空检查(失败时抛出 NullPointerException) Connection conn = Objects.requireNonNull(connection); // 带自定义错误信息的非空检查 Config config = Objects.requireNonNull(loadedConfig, "Configuration must be loaded"); // 提供默认值 DataProcessor processor = Objects.requireNonNullElse( customProcessor, DefaultProcessor.INSTANCE ); // 延迟生成默认值 Cache cache = Objects.requireNonNullElseGet( userCache, () -> createDefaultCache() ); ``` #### 3. 范围验证 ```java // 验证数组索引 int validIndex = Objects.checkIndex(index, array.length); // 验证子列表范围 int fromIndex = Objects.checkFromToIndex(start, end, collection.size()); // 验证缓冲区操作范围 int position = Objects.checkFromIndexSize(offset, length, buffer.capacity()); ``` ## 使用场景建议 1. **空值安全操作**: ```java // 传统方式(可能抛 NPE) if (user.getProfile().getName().equals("admin")) { ... } // 安全的 Objects.equals if (Objects.equals(user.getProfile().getName(), "admin")) { ... } ``` 2. **安全的哈希计算**: ```java // 传统方式需要处理每个对象的 null 检查 int hash = name != null ? name.hashCode() : 0; hash = 31 * hash + (age != null ? age.hashCode() : 0); // Objects.hash 简化写法 public int hashCode() { return Objects.hash(name, age, address); } ``` 3. **配置项验证**: ```java public void configure(AppConfig config) { this.config = Objects.requireNonNull(config, "AppConfig must not be null"); this.timeout = Objects.requireNonNullElseGet( config.getTimeout(), () -> Duration.ofSeconds(30) ); } ``` 4. **集合操作**: ```java public void processSublist(List<?> list, int from, int to) { int start = Objects.checkFromToIndex(from, to, list.size()); List<?> sub = list.subList(start, to); // 安全的处理子列表 } ``` ## 特性对比 | **功能** | **传统方式** | **Objects 方式** | | ------------ | --------------------------------- | ---------------------------------- | | **空值比较** | 需前置 null 检查 | `Objects.equals(a,b)` | | **哈希计算** | 需处理每个字段的 null 检查 | `Objects.hash(f1,f2,f3)` | | **空值验证** | `if (obj == null) throw...` | `Objects.requireNonNull(obj)` | | **索引验证** | `if (index < 0 or index >= size)` | `Objects.checkIndex(index, size)` | | **默认值** | 三目运算符 | `requireNonNullElse(obj, default)` | 使用 Objects 类能显著提高代码的健壮性和可读性,特别是在处理可能为 null 的对象时。 最后修改:2025 年 10 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。