在 Java 编程中,对象的处理是不可避免的。为了简化对象操作并减少空指针异常(NullPointerException
)的风险,Java 7 引入了 java.util.Objects
类。这个类包含了一系列静态方法,旨在帮助开发者更安全、更高效地处理对象。
1 引入 Objects 类
Objects
类位于 java.util
包中,因此在使用之前需要导入:
import java.util.Objects;
2 对象判空
在 Java 中,对象的判空操作非常常见。Objects
类提供了两个方法来处理对象的判空:
isNull(Object obj)
:判断对象是否为null
。nonNull(Object obj)
:判断对象是否不为null
。
示例代码:
Integer integer = new Integer(1);if (Objects.isNull(integer)) {System.out.println("对象为空");
}if (Objects.nonNull(integer)) {System.out.println("对象不为空");
}
3 对象为空时抛异常
在某些情况下,如果对象为空,我们希望抛出空指针异常。Objects
类提供了 requireNonNull
方法来实现这一功能:
Integer integer1 = new Integer(128);Objects.requireNonNull(integer1);
Objects.requireNonNull(integer1, "参数不能为空");
Objects.requireNonNull(integer1, () -> "参数不能为空");
4 判断两个对象是否相等
Objects
类提供了 equals
方法,用于判断两个对象是否相等。这个方法可以处理 null
值的比较,而不会抛出空指针异常。
示例代码:
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);System.out.println(Objects.equals(integer1, integer2)); // true
然而,需要注意的是,Objects.equals
方法依赖于被比较对象的 equals
方法实现。如果对象的类没有正确实现 equals
方法,可能会产生不符合预期的结果。
例如:
public class ObjectsDemo1 {public static void main(String[] args) {Person person1 = new Person("沉默王二", 18);Person person2 = new Person("沉默王二", 18);System.out.println(Objects.equals(person1, person2)); // 输出:false}
}class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}
}
在这个例子中,Person
类没有重写 equals
方法,因此默认使用 Object
类的 equals
方法,只比较对象引用是否相同。为了解决这个问题,我们需要在 Person
类中重写 equals
方法:
@Override
public boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);
}
5 获取对象的 hashCode
Objects
类提供了 hashCode
方法,用于获取对象的 hashCode
:
String str = new String("沉默王二");
System.out.println(Objects.hashCode(str)); // 输出:867758096
6 比较两个对象
compare
方法用于比较两个对象,通常用于自定义排序。它需要一个比较器(Comparator
)作为参数。如果比较器为 null
,则使用自然顺序。
示例代码:
class ObjectsCompareDemo {public static void main(String[] args) {PersonCompare person1 = new PersonCompare("itwanger", 30);PersonCompare person2 = new PersonCompare("chenqingyang", 25);Comparator<PersonCompare> ageComparator = Comparator.comparingInt(p -> p.age);int ageComparisonResult = Objects.compare(person1, person2, ageComparator);System.out.println("年龄排序: " + ageComparisonResult); // 输出:1(表示 person1 的 age 在 person2 之后)}
}class PersonCompare {String name;int age;PersonCompare(String name, int age) {this.name = name;this.age = age;}
}
7 比较两个数组
deepEquals
方法用于比较两个数组类型的对象。当对象是非数组时,其行为与 equals
方法一致。
示例代码:
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
int[] array3 = {1, 2, 4};System.out.println(Objects.deepEquals(array1, array2)); // 输出:true
System.out.println(Objects.deepEquals(array1, array3)); // 输出:false// 对于非数组对象,deepEquals() 的行为与 equals() 相同
String string1 = "hello";
String string2 = "hello";
String string3 = "world";System.out.println(Objects.deepEquals(string1, string2)); // 输出:true
System.out.println(Objects.deepEquals(string1, string3)); // 输出:false
对于二维数组的比较:
String[][] nestedArray1 = {{"A", "B"}, {"C", "D"}};
String[][] nestedArray2 = {{"A", "B"}, {"C", "D"}};
String[][] nestedArray3 = {{"A", "B"}, {"C", "E"}};System.out.println(Objects.deepEquals(nestedArray1, nestedArray2)); // 输出:true
System.out.println(Objects.deepEquals(nestedArray1, nestedArray3)); // 输出:false
7 小结
除了上述方法,Objects
类还提供了其他一些实用的方法,如 toString
等。这些方法在许多情况下非常有用,可以简化代码并减少出错的可能性。
总之,Objects
类提供的这些方法在处理对象时非常有用,能够帮助开发者更安全、更高效地编写代码。
8 思维导图
9 参考链接
Objects:专为操作Java对象而生的工具类