在 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
}
}