java.util.Objects的使用

java.utils.Objects针对Object对象提供了几个静态的工具方法,这些方法可以归类为:

  1. null安全检查
  2. 对象比较
  3. 计算对象hash code
  4. 对象转换为String

null安全检查

null安全检查有5个方法:

  • isNull(Object obj):检查对象是否为null,null返回true,否则返回false
  • nonNull(Object obj):与isNull相反,检查对象是否为非null,非null返回true,否则返回false
  • requreNonNull:其他三个方法为参数不同requreNonNull,这三个方法要求对象为非null,否则抛出NullPointException。

示例

 public User(final String newLastName, final String newFirstName){
      this.lastName = Objects.requireNonNull(newLastName, "Last name cannot be null.");
      this.firstName = Objects.requireNonNull(newFirstName, "First name cannot be null.");
 }

对象比较

对象比较有三个方法:

  • compare(T a, T b, Comparator<? super T> c):返回int,等同于使用c.compare(a, b)比较
  • equals(Object a, Object b):对象相等笔记。a和b同为null,返回true,否则调用对象的equals方法作比较。
  • deepEquals(Object a, Object b):和equals不同的地方是,如果比较的对象为数组,它会调用Arrays.equals0方法比较数组内的元素。

使用Objects.equals方法可以简化我们自己写的equals方法。

原来实现对象的equals方法:

public class Bar {
    private Foo foo1;
    private Foo foo2;

    @Override
    public boolean equals(Object obj){
        if (obj == this) {
            return true;
        } 
        if (obj instanceof Bar) {
            Bar other = (Bar) obj; 
            if (foo1 != other.foo1) {
                if (foo1 == null || !foo1.equals(other.foo1)) {
                    return false;
                }
            } 
            if (foo2 != other.foo2) {
                if (foo2 == null || !foo1.equals(other.foo2)) {
                    return false;
                }
            } 
            return true;
        } 
        return false;
    }
}

我们需要写类似的代码比较对象内的成员变量。

使用Objects.equals

public class Bar {
    private Foo foo1;
    private Foo foo2;

    @Override
    public boolean equals(Object obj){
        if (obj == this) {
            return true;
        } 
        if (obj instanceof Bar) {
            Bar other = (Bar) obj; 
            return Objects.equals(foo1, other.foo1) && Objects.equals(foo2, other.foo2)
        } 
        return false;
    }
}

对成员变量的比较可以简化为一行代码。

计算对象的hash code

计算对象的hash code有两个方法:

  • hashCode(Object o):对象为null,返回0,否则返回对象的hashCode
  • hash(Object... values):对多个输入的对象计算hash

hash方法也起到简化代码,增强代码可读性的作用。

原来实现hashCode方法:

public class Bar {
    private Foo foo1;
    private Foo foo2;

    @Override
    public int hashCode(){
        int result = 17;

        result = 31 * result + (foo1 == null ? 0 : foo1.hashCode());
        result = 31 * result + (foo2 == null ? 0 : foo2.hashCode());

        return result;
    }
}

使用Objects.hash

public class Bar {
    private Foo foo1;
    private Foo foo2;

    @Override
    public int hashCode(){
        return Objects.hash(foo1,foo2);
    }
}

可以看到,只需要一行代码便可以计算出对象的hashCode,并且大大增强了代码的可读性。

对象转换为String

转换对象为String有两个方法:

  • toString(Object o):如果对象为非null,返回对象的toString内容,否则返回“null”字符串
  • toString(Object o, String nullDefault):和第一个方法的区别在于,nullDefault可以让我们设置null对象的默认显示。如何一些前端做接口时,可能需要把"null"设置为空字符串。

版权声明:著作权归作者所有。

相关推荐

Java 10 var的使用及限制

在Java 10的众多特性里,局部变量的类型推断是比较受大家关注的特性之一。这里简单介绍下它的使用以及限制。在Java 7,声明一个列表我们会这样做:List<String> list = new ArrayList<String>(); Java 8/9可以改写为:List<String>&

Java使用Gradle依赖配置compile,implementation和api的区别

这个主要看Java项目所使用的Gradle的版本。Gradle3.4新增了Java-library插件,java-library插件使用了新的依赖配置implementation和api。旧的依赖配置compile被废弃。Gradle3.4之前的版本java插件apply plugin: 'java' 添加依赖dependencies { compile '

Java检查非null值有必要同时使用@NonNull和Objects.requireNonNull()吗

Java的@NonNull和Objects.requireNonNull()常常会被用来限制值为非null值,它们有什么不同呢?@NonNull在引入@NonNull之前,我们要求使用非null值时,往往需要在javadoc里做说明。编译器是没有办法对javadoc进行干预。使用注解类型@NonNull后,编译器就可以在编译时对代码做检查。这也有利于一些ide根据注解类型,对null值的代码给出提

配置Eclipse使用Java9

Oxygen 4.7.1aEclipse Oxygen 4.7.1a已经支持Java 9启动,以及支持Java 9的开发,直接安装Eclipse Oxygen 4.7.1a即可,不需要特别的配置。但运行可能会出现一些环境问题,也可以按以下配置eclipse.ini指定Java 9的vm-vm C:\Program&nb

Java Objects.hash()与自己实现的hashCode()比较

Java 7新增了Objects类,它为对象提供了一些便捷的静态方法,如equals(),hashCode(),hash(),compare(),toString()等等。这里比较一下Objects.hash()与自己实现的hashCode()。传统实现的hashCode@Override public int hashCode() {  &nbs