Objects类常用方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值