Java7 新增 Objects 类

在 Java7 中,引入了 Objects 实用工具类。

Objects 类由用于对对象进行操作的静态实用程序方法组成。这些实用程序包括用于计算对象哈希代码、返回对象字符串和比较两个对象的 null 安全或 null 容错方法。

Objects 类的主要方法包括:

compare 方法

static <T> int compare(T a, T b, Comparator<? super T> c)  如果参数相同,则返回0。否则返回 c.compare(a, b) 的结果。因此,如果两个参数都为 null,则返回 0。

请注意,如果其中一个参数为空,则可能会或不会抛出 NullPointerException(空指针异常),这取决于比较器为空值选择了何种排序策略。

示例:

package com.hxstrive.jdk7.objects;

import java.util.Comparator;
import java.util.Objects;

/**
 * Objects 类
 * @author hxstrive.com
 */
public class ObjectsDemo1 {

    public static void main(String[] args) {
        // 自定义比较器
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        };

        System.out.println(Objects.compare(null, null, comparator)); //0
        //System.out.println(Objects.compare("a", null, comparator)); //错误:空指针
        //System.out.println(Objects.compare(null, "b", comparator)); //错误:空指针
        System.out.println(Objects.compare("a", "b", comparator)); //-1
    }

}

deepEquals 方法

static boolean deepEquals(Object a, Object b)  如果参数彼此深度相等,则返回 true,否则返回 false。两个 null 值深度相等。如果两个参数都是数组,则使用 Arrays.deepEquals 中的算法确定相等。否则,将使用第一个参数的 equals 方法确定相等。

示例:

package com.hxstrive.jdk7.objects;

import java.util.Objects;

/**
 * Objects 类
 * @author hxstrive.com
 */
public class ObjectsDemo2 {

    static class Person {
        private String name;

        public Person(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object obj) {
            System.out.println("Person.equals()");
            return this.name.equals(((Person) obj).name);
        }
    }

    public static void main(String[] args) {
        Person p1 = new Person("p1");
        Person p2 = new Person("p1");
        System.out.println(Objects.deepEquals(p1, p2));
        //输出:
        //Person.equals()
        //true

        String[] arr1 = {"a", "b"};
        String[] arr2 = {"a", "c"};
        System.out.println(Objects.deepEquals(arr1, arr2)); //false

        arr2[1] = "b";
        System.out.println(Objects.deepEquals(arr1, arr2)); //true
    }

}

equals 方法

static boolean equals(Object a, Object b) 如果参数相等,则返回 true,否则返回 false。因此,如果两个参数都为 null,则返回 true;如果只有一个参数为 null,则返回 false。否则,通过使用第一个参数的 equals 方法来确定是否相等。

示例:

package com.hxstrive.jdk7.objects;

import java.util.Objects;

/**
 * Objects 类
 * @author hxstrive.com
 */
public class ObjectsDemo3 {

    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        System.out.println(Objects.equals(str1, str2)); //true

        str2 = null;
        System.out.println(Objects.equals(str1, str2)); //false
    }

}

hash 和 hashCode 方法

static int hashCode(Object o) 参数不为 null,返回哈希代码;否则,返回 0。

static int hash(Object... values) 生成输入值序列的散列代码。生成散列代码的过程就像将所有输入值放入一个数组,然后调用 Arrays.hashCode(Object[]) 对数组进行散列。

该方法适用于对包含多个字段的对象执行 Object.hashCode()。例如,如果一个对象有 x、y 和 z 三个字段,那么就可以写:

@Override 
public int hashCode() {
    return Objects.hash(x, y, z);
}

⚠️警告:如果只提供一个对象的引用,返回值不等于该对象引用的散列代码,即 Objects.hash(a) != a.hashCode()。该值可通过调用 hashCode(Object) 计算得出。

示例:

package com.hxstrive.jdk7.objects;

import java.util.Objects;

/**
 * Objects 类
 * @author hxstrive.com
 */
public class ObjectsDemo4 {

    public static void main(String[] args) {
        String s1 = "abc";
        System.out.println(Objects.hashCode(s1)); //96354
        System.out.println(s1.hashCode()); //96354

        System.out.println(Objects.hash("abc")); //96385
        System.out.println(Objects.hash('a', 'b', 'c')); //126145
    }

}

requireNonNull 方法

static <T> T requireNonNull(T obj) 检查指定的对象引用是否为空,如果为空则抛出 NullPointerException 异常。该方法主要用于在方法和构造函数中进行参数验证,如下所示:

public Foo(Bar bar) {
    this.bar = Objects.requireNonNull(bar);
}

static <T> T requireNonNull(T obj, String message) 检查指定的对象引用是否为空,如果为空,则抛出一个自定义的 NullPointerException。该方法主要用于在具有多个参数的方法和构造函数中进行参数验证,如下所示:

public Foo(Bar bar, Baz baz) {
    this.bar = Objects.requireNonNull(bar, "bar must not be null");
    this.baz = Objects.requireNonNull(baz, "baz must not be null");
}

示例:

package com.hxstrive.jdk7.objects;

import java.util.Objects;

/**
 * Objects 类
 * @author hxstrive.com
 */
public class ObjectsDemo5 {

    private static void show1(String message) {
        try {
            Objects.requireNonNull(message);
            System.out.println(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void show2(String message) {
        Objects.requireNonNull(message, "message is null");
        System.out.println(message.toUpperCase());
    }

    public static void main(String[] args) {
        show1(null);
        show2(null);
    }

    //java.lang.NullPointerException
    //	at java.base/java.util.Objects.requireNonNull(Objects.java:233)
    //	at com.hxstrive.jdk7.objects.ObjectsDemo5.show1(ObjectsDemo5.java:14)
    //	at com.hxstrive.jdk7.objects.ObjectsDemo5.main(ObjectsDemo5.java:27)
    //Exception in thread "main" java.lang.NullPointerException: message is null
    //	at java.base/java.util.Objects.requireNonNull(Objects.java:259)
    //	at com.hxstrive.jdk7.objects.ObjectsDemo5.show2(ObjectsDemo5.java:22)
    //	at com.hxstrive.jdk7.objects.ObjectsDemo5.main(ObjectsDemo5.java:28)

}

toString 方法

static String toString(Object o) 如果参数不为 null,则返回调用 toString 的结果;如果参数为 null,则返回 "null"。

static String toString(Object o, String nullDefault) 如果第一个参数不为 null,则返回对第一个参数调用 toString 的结果,否则返回第二个参数 nullDefault。

示例:

package com.hxstrive.jdk7.objects;

import java.util.Objects;

/**
 * Objects 类
 * @author hxstrive.com
 */
public class ObjectsDemo6 {

    public static void main(String[] args) {
        String str = null;
        System.out.println(Objects.toString(str)); //null
        System.out.println(Objects.toString(str, "default")); //default
    }

}


说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号