Java中Objects类的常用方法
Objects类提供了一些工具方法,都是public static修饰的。
而且Objects本身是工具类,不提供构造方法,不能继承。
其构造方法源码为:
public final class Objects {
private Objects() {
throw new AssertionError("No java.util.Objects instances for you!");
}
// ...
}
设置几个类,方便测试:
package com.pipi.test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.junit.Test;
import java.util.Objects;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors
class Person {
private Integer id;
private String name;
private Integer gender; // 0女,1男
private Dog dog;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors
class Human {
private Integer id;
private String name;
private Integer gender;
private Dog dog;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors
class Dog {
private String name;
}
1、boolean equals(Object a, Object b)
功能:判断两个对象内容是否一样。
方法源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
测试代码:
@Test
public void m1() {
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
Person person2 = new Person(1001,"张三",1,new Dog("旺财"));
Person person3 = new Person(1002,"李四",1,new Dog("阿黄"));
Human human1 = new Human(1001,"张三",1,new Dog("旺财"));
System.out.println(Objects.equals(person1, person2)); // true
System.out.println(Objects.equals(person2, person3)); // false
System.out.println(Objects.equals(person1, human1)); // false
}
提示:
一般对比的两个对象类型是一样的,不一样对比就没有意义;
如果对比对象中的属性是引用类型的话,这些引用类型也要重写equals()方法。显然Java中的 Integer,String等这些类都已经重写了。
2、boolean deepEquals(Object a, Object b)
功能:deepEquals主要针对两个数组对象判断。
方法源码:
public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}
测试代码:
@Test
public void m2() {
String[] hobby1 = {"听歌","跑步"};
String[] hobby2 = {"听歌","跑步"};
String[] hobby3 = {"打球","游泳","看书"};
System.out.println(Objects.deepEquals(hobby1, hobby2)); // true
System.out.println(Objects.deepEquals(hobby2, hobby3)); // false
}
3、int hashCode(Object o)
功能:获取对象的哈希值,返回int值。
方法源码:
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
测试代码:
@Test
public void m3() {
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
Person person2 = new Person(1001,"张三",1,new Dog("旺财"));
Person person3 = new Person(1002,"李四",1,new Dog("阿黄"));
Human human1 = new Human(1001,"张三",1,new Dog("旺财"));
System.out.println(Objects.hashCode(person1)); // 264269147
System.out.println(Objects.hashCode(person2)); // 264269147
System.out.println(Objects.hashCode(person3)); // 268825255
System.out.println(Objects.hashCode(human1)); // 264269147
// 这个human1类型跟person1类型不一样,但属性是一模一样的,它们哈希值居然相同
}
说明:哈希值跟对象属性的类型,属性的值有关系。
并且hashCode() 和 equals() 的重写,对HashMap的存储有很大的作用。
4、String toString(Object o)
功能:获取一个对象的字符串形式。
方法源码:
public static String toString(Object o) {
return String.valueOf(o);
}
测试代码:
@Test
public void m4() {
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
System.out.println(Objects.toString(null)); // null
System.out.println(Objects.toString(person1)); // Person(id=1001, name=张三, gender=1, dog=Dog(name=旺财))
String s = Objects.toString(null, "-"); // 当传入对象为null时,返回指定字符串
System.out.println(s); // -
}
5、int compare(T a, T b, Comparator<? super T> c)
功能:比较两个对象,返回int值。需要传入比较器。
方法源码:
public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 : c.compare(a, b);
}
测试代码:
@Test
public void m5() {
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
Person person2 = new Person(1001,"张三",1,new Dog("阿黄"));
Comparator<Person> comparator = (p1,p2) -> {
// 假设id一样,这两个对象就一样
if (p1.getId() != null && p1.getId().equals(p2.getId()))
return 0;
return 1;
};
System.out.println(Objects.compare(person1, person2, comparator)); // 0
}
6、boolean isNull(Object obj)
boolean nonNull(Object obj)
功能:判断对象是否为null,是否不为null。
方法源码:
public static boolean isNull(Object obj) {
return obj == null;
}
public static boolean nonNull(Object obj) {
return obj != null;
}
测试代码:
@Test
public void m6() {
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
Person person2 = null;
System.out.println(Objects.isNull(person1)); // false
System.out.println(Objects.isNull(person2)); // true
System.out.println(Objects.nonNull(person1)); // true
System.out.println(Objects.nonNull(person2)); // false
}
7、static T requireNonNull(T obj)
功能:保证传入对象不为空,为空则抛出异常。
方法源码:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
测试代码:
@Test
public void m7() {
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
Objects.requireNonNull(person1);
Person person2 = null;
Objects.requireNonNull(person2); // 抛出 NullPointerException 异常
}
当然也可以用断言Assert的相应方法确保传入的参数对象:
@Test
public void m8() {
// 假设这两个对象,是传入的参数
Person person1 = new Person(1001,"张三",1,new Dog("旺财"));
Person person2 = null;
Assert.notNull(person1);
Assert.notNull(person2); // 抛出 IllegalArgumentException 异常
}