Java中Objects类的常用方法

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 异常
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值