Objects:专为操作Java对象而生的工具类, Java 的 Objects 类是一个实用工具类,包含了一系列静态方法,用于处理对象。它位于 java.util 包中,自 Java 7 引入。Objects 类的主要目的是降低代码中的空指针异常open in new window (NullPointerException) 风险,同时提供一些非常实用的方法供我们使用。
Java中提供了许多工具类来方便我们开发,其中一个就是Objects类。Objects 类是 JDK 7 中新增的一个工具类,它提供了一些静态方法,用于操作对象。在这篇文章中,我们将深入讲解Objects类及其所有使用方法,并附上代码示例,使读者能更好地掌握该工具类的使用。
一、关于Objects类
Objects类是Java 7中新增的一个工具类,主要是提供了一些静态方法以方便对对象的处理。在JDK8及之后的版本中,该类被定义在java.util包中,可以通过以下代码导入:
import java.util.Objects;
二、equals方法
equals方法是Java中判断两个对象是否相等的方法,但是在我们进行判断之前,我们需要考虑到空值的情况。使用Objects类可以很好地处理空值,下面是一个使用Objects#equals方法来判断两个对象是否相等的例子:
public class ObjectExample {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "world";
String str3 = null;
System.out.println(Objects.equals(str1, str2)); //false
System.out.println(Objects.equals(str1, "hello")); //true
System.out.println(Objects.equals(str1, str3)); //false
System.out.println(Objects.equals(null, str3)); //true
}
}
在上面的代码中,我们可以看到Objects#equals方法会先检查参数是否均为null,如果是,则返回true。如果其中一个参数为null,另一个不是,则返回false。如果两个参数均不为null,则返回的结果是根据调用第一个参数对象的equals方法得到的,如果第一个对象没有实现equals方法,则返回第二个对象的equals方法的反值。
三、hashCode方法
Hash码是一个为对象生成的整数值,它通常被用于加速对象在散列表中的查找操作。Java中的hashCode方法是Object类的一个方法,用于返回当前对象的hash码。但是,我们有时需要自己重写hashCode方法以实现更好的效率或更恰当的处理方法,Objects#hash方法能帮助我们更快地编写自己的hashCode方法,下面是一个使用Objects#hash方法来生成hashCode的例子:
public class ObjectExample {
public static void main(String[] args) {
String str = "hello world";
int hash = Objects.hash(str, 123, true);
System.out.println("hash: " + hash); //1357256172
}
}
在上面的代码中,我们可以看到,Objects#hash方法可以接受任意数量的参数,并返回它们的hash码的组合值。这些参数可以是任意类型,包括null。由于所有的非基本类型都实现了Object类,因此可以传递任意类型的对象作为参数。
四、requireNonNull方法
requireNonNull方法是Objects类提供的一个检查空值的方法。它接受两个参数:一个是要检查的对象,另一个是错误信息。如果传递的对象为null,则抛出NullPointerException异常,并将传递的错误信息作为异常信息提示。
public class ObjectExample {
public static void main(String[] args) {
String str = null;
Objects.requireNonNull(str, "字符串不能为空");
}
}
在上面的代码中,我们可以看到如果我们将字符串str设为null,那么调用Objects#requireNonNull方法就会抛出NullPointerException异常,并将传递的错误信息作为异常信息提示。
五、isNull方法和nonNull方法
如果我们想判断一个对象是否为null或非null,可以使用Objects类提供的isNull方法和nonNull方法。
public class ObjectExample {
public static void main(String[] args) {
String str = null;
if (Objects.isNull(str)) {
System.out.println("str is null");
} else {
System.out.println("str is not null");
}
str = "hello";
if (Objects.nonNull(str)) {
System.out.println("str is not null");
} else {
System.out.println("str is null");
}
}
}
六、toString方法
Java中的toString方法是用于获取对象的字符串表示形式的方法。但是,如果对象为null,那么调用它的toString方法将抛出NullPointerException异常。要避免这种情况,我们可以使用Objects类提供的toString方法。
public class ObjectExample {
public static void main(String[] args) {
String str = "hello";
System.out.println(Objects.toString(str)); //hello
str = null;
System.out.println(Objects.toString(str)); //null
}
}
在上面的代码中,我们可以看到,如果我们使用Objects#toString方法来获取对象的字符串表示形式,那么当对象为null时,我们将得到一个null字符串,而不是抛出NullPointerException异常。
七、例外信息
在调试代码时,如果我们需要打印出异常信息,通常使用的方法是将异常对象作为参数传递给printStackTrace方法。但有时候我们会遇到一种情况,就是可能存在异常对象为null的情况。这时候,我们可以使用Objects类提供的例外信息方法。
public class ObjectExample {
public static void main(String[] args) {
try {
// some codes here
} catch (Exception e) {
System.err.println(Objects.toString(e.getMessage(), "no message"));
System.err.println(Objects.toString(e.getCause(), "no cause"));
}
}
}
在上面的代码中,我们可以看到,如果e.getMessage()或e.getCause()的返回值为null,我们将得到一个"no message"或"no cause"字符串,而不是抛出NullPointerException异常。
八、实例化对象
除了以上方法,Objects类还提供了一些用于实例化对象的方法。例如,我们可以使用Objects.requireNonNullElse方法来获取一个默认值,如果传入的参数为null,则返回默认值。
public class ObjectExample {
public static void main(String[] args) {
String str = null;
String defaultValue = "default value";
System.out.println(Objects.requireNonNullElse(str, defaultValue)); //default value
}
}
在上面的代码中,我们可以看到如果我们将字符串str设为null,那么调用Objects#requireNonNullElse方法就会返回传递的默认值。
九、总结
本文主要介绍了Java中的Objects类,该类提供了一些静态方法,用于操作对象。我们介绍了以下方法:
-
equals方法:用于判断两个对象是否相等。
-
hashCode方法:用于生成对象的hash码。
-
requireNonNull方法:用于检查空值。
-
isNull方法和nonNull方法:用于判断一个对象是否为null或非null。
-
toString方法:用于获取对象的字符串表示形式。
-
例外信息:用于打印异常信息。
-
实例化对象:用于获取默认值。
通过本文的介绍,相信读者已经掌握了Objects类的使用方法。在实际开发中,我们可以根据具体情况选择合适的方法来操作对象,提高程序的效率和可读性。