1、概述
Objects类是Java标准库中的一个工具类(最终类),位于java.util包中,专门为操作对象提供了一组静态方法(空值检查、对象比较、哈希码生成、输出对象字符串表示、深度比较以及要求非空对象等)。旨在帮助开发者更安全、更高效地处理对象。应用场景如下:
- 防止空指针异常:通过提供null安全的方法,Objects类有助于减少空指针异常的发生,提高代码的健壮性。
- 简化对象操作:提供了一系列实用的静态方法,简化了对象比较、哈希码生成、字符串表示等常见操作,提高了代码的可读性和可维护性。
- 生成字符串表示:在调试或日志记录时,使用Objects.toString可以生成对象的字符串表示,方便查看对象信息。
2、常用方法
1、判空方法:主要用于判断对象与null,有isNull()和nonNull()这两个方法。
- 1)、boolean isNull(Object obj) :用于判断对象是否为null,返回一个boolean值。
- 2)、boolean nonNull(Object obj):用于判断对象是否不为null,返回一个boolean值。
// 1、判空方法
String str1 = null;
String str2 = "HelloWorld";
// 1)、isNull(Object obj):用于判断对象是否为null。
System.out.println(Objects.isNull(str1)); // 输出true
System.out.println(Objects.isNull(str2)); // 输出false
// 2)、nonNull(Object obj):用于判断对象是否不为null。
System.out.println(Objects.nonNull(str1)); // 输出false
System.out.println(Objects.nonNull(str2)); // 输出true
2、requireNonNull():检查对象是否为null,并抛出异常,主要有以下三种重载方式:
- 1)、T requireNonNull(T obj):用于检查对象是否为null,如果是则抛出NullPointerException。
// 1)、requireNonNull(T obj):用于检查对象是否为null,如果是则抛出NullPointerException Person p1 = new Person("张三", 25); Person p2 = null; Objects.requireNonNull(p1); System.out.println("p1检查完毕"); // 输出p1检查完毕 Objects.requireNonNull(p2); // p2为null,抛出NullPointerException异常 System.out.println("p2检查完毕"); // 出现NullPointerException异常,不再执行
- 2)、T requireNonNull(T obj, String message):用于检查对象是否为nul,如果是则抛出NullPointerException并附带错误信息。
// 2)、requireNonNull(T obj, String message):用于检查对象是否为nul,是则抛出NullPointerException并附带错误信息。 Person p1 = new Person("张三", 25); Person p2 = null; try { Objects.requireNonNull(p1, "p1是空对象"); // p1不为null,正常往下执行 System.out.println("p1检查完毕"); // 输出p1检查完毕 Objects.requireNonNull(p2, "p2是空对象"); // p2为null,抛出NullPointerException异常,并设置异常信息为"p2是空对象" System.out.println("p2检查完毕"); // 出现NullPointerException异常,不再执行 } catch (NullPointerException e) { // 捕获空指针异常 System.out.println("出现异常!"); // 输出"出现异常!" System.out.println(e.getMessage()); // 输出p2是空对象 }
- 3)、T requireNonNull(T obj, Supplier<String> messageSupplier):用于检查对象是否为null,如果是抛出异常时使用Supplier提供错误信息。
// 3)、requireNonNull(T obj, Supplier<String> messageSupplier):用于检查对象是否为null,如果是抛出异常时使用Supplier提供错误信息。 Person p1 = new Person("张三", 25); Person p2 = null; try { Objects.requireNonNull(p1, () -> "p1是空对象"); // p1不为null,正常往下执行 System.out.println("p1检查完毕"); // 输出p1检查完毕 Objects.requireNonNull(p2, () -> "p1是空对象"); // p2为null,抛出NullPointerException异常 System.out.println("p2检查完毕"); // 捕获空指针异常 } catch (NullPointerException e) { System.out.println("出现异常!"); // 输出"出现异常!" System.out.println(e.getMessage()); // 输出p2是空对象// 输出p2是空对象 }
3、equals():主要用于判断两个对象是否相等,有equals()和deepEquals这两个方法。
- 1)、boolean equals(Object a, Object b):用于比较两个对象是否相等。与Object类的equals方法不同,此方法可以处理null值的比较而不会抛出空指针异常。工作原理如下:
- Ⅰ、如果a和b是同一个对象的引用,即a == b,是则直接返回true,不是则执行下面步骤。
- Ⅱ、如果a或b为null,则只有在a和b都为null时才返回true,否则返回false。
- Ⅲ、如果a和b都不为null,则调用a.equals(b)方法来判断是否相等。
- 2)、boolean deepEquals(Object a, Object b):用于深度比较两个对象是否相等。如果两个对象是数组,则比较数组内的对应元素是否相同。对于非数组对象,其行为与equals方法一致。工作原理如下:
- ①、如果a和b是同一个对象的引用,即a == b,是则直接返回true,不是则执行下面步骤。
- ②、如果a或b为null,则只有在a和b都为null时才返回true,否则返回false。
- ③、如果a和b都是数组,则使用Arrays.deepEquals方法来比较它们的内容是否相等。
- ④、如果a和b都不是数组,则调用a.equals(b)来判断它们是否相等(此时的行为与equals方法相同)。
// 3、比较相等方法
// 1)、equals(Object a, Object b):用于比较两个对象是否相等。
// String对象的比较:String类实现了equals()方法,值相同会返回true
String str1 = new String("HelloWorld");
String str2 = str1;
String str3 = new String("HelloWorld");
System.out.println(Objects.equals(str1, str2)); // 输出true,同一个对象的引用
System.out.println(Objects.equals(str1, str3)); // 输出true,虽然不是同一个对象,但调用equals()方法返回true
// 自定以对象的比较:Person类并未重写了equals方法,即equals()方法是从Object对象继承来的通过比较地址值的方式来判断
Person p1 = new Person("张三", 25);
Person p2 = p1;
Person p3 = new Person("张三", 25);
System.out.println(Objects.equals(p1, p2)); // 输出true,同一个对象的引用
System.out.println(Objects.equals(p1, p3)); // 输出false,不是同一个对象,且调用equals()方法返回的是false
// null值的比较:如果a或b为null,则只有在a和b都为null时才返回true,否则返回false
String s = "HelloWorld";
System.out.println(Objects.equals(null, s)); // 输出false
System.out.println(Objects.equals(s,null)); // 输出false
System.out.println(Objects.equals(null, null)); // 输出true
// 2)、boolean deepEquals(Object a, Object b):用于深度比较两个对象是否相等。
// 如果两个对象是数组,则比较数组内的对应元素是否相同。对于非数组对象,其行为与equals方法一致。
Integer[] array1 = {1, 2, 3};
Integer[] array2 = {1, 2, 3};
Integer[] array3 = {1, 3, 2};
System.out.println(Objects.deepEquals(array1, array2)); // 输出true
System.out.println(Objects.deepEquals(array1, array3)); // 输出false
注意:需要注意被比较对象的类是否正确实现了equals方法。如果类没有正确实现equals方法,则比较结果可能不符合预期。
4、哈希码生成方法:用于获取对象的哈希码,有hashCode()和hash()这两个方法。
- 1)、int hashCode(Object o):返回对象的哈希码。如果参数为null,则返回0。
- 2)、int hash(Object... values):基于多个对象生成哈希码。所有输入值都放在一个数组中,然后通过调用Arrays.hashCode(Object[])对该数组进行散列处理。
// 4、获取哈希码的方法
// 1)、int hashCode(Object o):返回对象的哈希码。
String str = "HelloWorld";
int hashCode = Objects.hashCode(str);
System.out.println("获取对象的哈希码:" + hashCode); // 输出439329280
// 2)、int hash(Object... values):基于多个对象生成哈希码。
int hash1 = Objects.hash("Hello", "World", 123);
System.out.println("基于多个对象生成的哈希码:" + hash1); // 输出772176858
5、toString():将对象转换为字符串,有以下两种重载方式:
- 1)、String toString(Object o):返回对象的字符串表示。
- 2)、String toString(Object o, String nullDefault):返回对象的字符串表示,如果对象为null,则返回默认值。
// 5、转换字符串方法
Person p1 = new Person("张三", 22);
Person p2 = null;
// 1)、String toString(Object o):返回对象的字符串表示。
String s1 = Objects.toString(p1);
String s2 = Objects.toString(p2);
System.out.println("将对象转为字符串:" + s1); // 输出Person{name='张三', age=22}
System.out.println("将null转为字符串:" + s2); // 输出null
// 2)、String toString(Object o, String nullDefault):返回对象的字符串表示,如果对象为null,则返回默认值。
String s3= Objects.toString(p1, "default");
String s4 = Objects.toString(p2, "default");
System.out.println("将对象转为设置了默认值的字符串" + s3); // 输出输出Person{name='张三', age=22}
System.out.println("将null转为设置了默认值的字符串" + s4); // 输出default
6、int compare(T a, T b, Comparator<? super T> c):比较两个对象。需要一个Comparator比较器作为参数来定义比较规则。如果两个对象相等,则返回0;否则返回c.compare(a, b)的结果。
- 1)、如果返回值 < 0,表示a小于b。
- 2)、如果返回值 = 0,表示a等于b。
- 3)、如果返回值 > 0,表示a大于b。
// 6、compare(T a, T b, Comparator<? super T> c):比较两个对象。
Person p1 = new Person("张三", 22);
Person p2 = new Person("李四", 34);
Person p3 = new Person("李四", 22);
System.out.println("根据年龄字段进行比较:");
Comparator<Person> comparator = Comparator.comparing(Person::getAge);
System.out.println(Objects.compare(p1, p2, comparator)); // 输出-1
System.out.println(Objects.compare(p1, p3, comparator)); // 输出0
System.out.println(Objects.compare(p2, p3, comparator)); // 输出1