在 Java7 中,引入了 Objects 实用工具类。
Objects 类由用于对对象进行操作的静态实用程序方法组成。这些实用程序包括用于计算对象哈希代码、返回对象字符串和比较两个对象的 null 安全或 null 容错方法。
Objects 类的主要方法包括:
static <T> int compare(T a, T b, Comparator<? super T> c) 如果参数相同,则返回0。否则返回 c.compare(a, b) 的结果。因此,如果两个参数都为 null,则返回 0。
请注意,如果其中一个参数为空,则可能会或不会抛出 NullPointerException(空指针异常),这取决于比较器为空值选择了何种排序策略。
示例:
package com.hxstrive.jdk7.objects; import java.util.Comparator; import java.util.Objects; /** * Objects 类 * @author hxstrive.com */ public class ObjectsDemo1 { public static void main(String[] args) { // 自定义比较器 Comparator<String> comparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }; System.out.println(Objects.compare(null, null, comparator)); //0 //System.out.println(Objects.compare("a", null, comparator)); //错误:空指针 //System.out.println(Objects.compare(null, "b", comparator)); //错误:空指针 System.out.println(Objects.compare("a", "b", comparator)); //-1 } }
static boolean deepEquals(Object a, Object b) 如果参数彼此深度相等,则返回 true,否则返回 false。两个 null 值深度相等。如果两个参数都是数组,则使用 Arrays.deepEquals 中的算法确定相等。否则,将使用第一个参数的 equals 方法确定相等。
示例:
package com.hxstrive.jdk7.objects; import java.util.Objects; /** * Objects 类 * @author hxstrive.com */ public class ObjectsDemo2 { static class Person { private String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object obj) { System.out.println("Person.equals()"); return this.name.equals(((Person) obj).name); } } public static void main(String[] args) { Person p1 = new Person("p1"); Person p2 = new Person("p1"); System.out.println(Objects.deepEquals(p1, p2)); //输出: //Person.equals() //true String[] arr1 = {"a", "b"}; String[] arr2 = {"a", "c"}; System.out.println(Objects.deepEquals(arr1, arr2)); //false arr2[1] = "b"; System.out.println(Objects.deepEquals(arr1, arr2)); //true } }
static boolean equals(Object a, Object b) 如果参数相等,则返回 true,否则返回 false。因此,如果两个参数都为 null,则返回 true;如果只有一个参数为 null,则返回 false。否则,通过使用第一个参数的 equals 方法来确定是否相等。
示例:
package com.hxstrive.jdk7.objects; import java.util.Objects; /** * Objects 类 * @author hxstrive.com */ public class ObjectsDemo3 { public static void main(String[] args) { String str1 = "Hello"; String str2 = "Hello"; System.out.println(Objects.equals(str1, str2)); //true str2 = null; System.out.println(Objects.equals(str1, str2)); //false } }
static int hashCode(Object o) 参数不为 null,返回哈希代码;否则,返回 0。
static int hash(Object... values) 生成输入值序列的散列代码。生成散列代码的过程就像将所有输入值放入一个数组,然后调用 Arrays.hashCode(Object[]) 对数组进行散列。
该方法适用于对包含多个字段的对象执行 Object.hashCode()。例如,如果一个对象有 x、y 和 z 三个字段,那么就可以写:
@Override public int hashCode() { return Objects.hash(x, y, z); }
⚠️警告:如果只提供一个对象的引用,返回值不等于该对象引用的散列代码,即 Objects.hash(a) != a.hashCode()。该值可通过调用 hashCode(Object) 计算得出。
示例:
package com.hxstrive.jdk7.objects; import java.util.Objects; /** * Objects 类 * @author hxstrive.com */ public class ObjectsDemo4 { public static void main(String[] args) { String s1 = "abc"; System.out.println(Objects.hashCode(s1)); //96354 System.out.println(s1.hashCode()); //96354 System.out.println(Objects.hash("abc")); //96385 System.out.println(Objects.hash('a', 'b', 'c')); //126145 } }
static <T> T requireNonNull(T obj) 检查指定的对象引用是否为空,如果为空则抛出 NullPointerException 异常。该方法主要用于在方法和构造函数中进行参数验证,如下所示:
public Foo(Bar bar) { this.bar = Objects.requireNonNull(bar); }
static <T> T requireNonNull(T obj, String message) 检查指定的对象引用是否为空,如果为空,则抛出一个自定义的 NullPointerException。该方法主要用于在具有多个参数的方法和构造函数中进行参数验证,如下所示:
public Foo(Bar bar, Baz baz) { this.bar = Objects.requireNonNull(bar, "bar must not be null"); this.baz = Objects.requireNonNull(baz, "baz must not be null"); }
示例:
package com.hxstrive.jdk7.objects; import java.util.Objects; /** * Objects 类 * @author hxstrive.com */ public class ObjectsDemo5 { private static void show1(String message) { try { Objects.requireNonNull(message); System.out.println(message); } catch (Exception e) { e.printStackTrace(); } } private static void show2(String message) { Objects.requireNonNull(message, "message is null"); System.out.println(message.toUpperCase()); } public static void main(String[] args) { show1(null); show2(null); } //java.lang.NullPointerException // at java.base/java.util.Objects.requireNonNull(Objects.java:233) // at com.hxstrive.jdk7.objects.ObjectsDemo5.show1(ObjectsDemo5.java:14) // at com.hxstrive.jdk7.objects.ObjectsDemo5.main(ObjectsDemo5.java:27) //Exception in thread "main" java.lang.NullPointerException: message is null // at java.base/java.util.Objects.requireNonNull(Objects.java:259) // at com.hxstrive.jdk7.objects.ObjectsDemo5.show2(ObjectsDemo5.java:22) // at com.hxstrive.jdk7.objects.ObjectsDemo5.main(ObjectsDemo5.java:28) }
static String toString(Object o) 如果参数不为 null,则返回调用 toString 的结果;如果参数为 null,则返回 "null"。
static String toString(Object o, String nullDefault) 如果第一个参数不为 null,则返回对第一个参数调用 toString 的结果,否则返回第二个参数 nullDefault。
示例:
package com.hxstrive.jdk7.objects; import java.util.Objects; /** * Objects 类 * @author hxstrive.com */ public class ObjectsDemo6 { public static void main(String[] args) { String str = null; System.out.println(Objects.toString(str)); //null System.out.println(Objects.toString(str, "default")); //default } }