java源码学习之Objects

1.Objects 与Object的区别

1.1.object是java中所有类的基类,java中所有的类都继承自Object,位于java.lang包下面;objects是object的一个工具类,位于java.util包下,被final修饰不能被继承,拥有私有的构造函数。

1.2.object在jdk1.0就出现了;objects出生于jdk1.7。

1.3.Objects由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的)。

2.Objects 方法介绍及分析

2.1.构造器私有化,而且抛出异常,工具类都应该有的,防止生成没用的对象。

private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
}

2.2.Object的equals方法调用者如果为null回报空指针异常,这个方法避免了这个问题,优于Object的equals

public static boolean equals(Object a, Object b) {
   return (a == b) || (a != null && a.equals(b));
}

2.3.深度比较两个对象。当参数是数组对象,其方法内部采用的是Arrays.deepEquals0方法的算法。使用Objects.deepEquals方法有个好处,当我们在写业务代码时,可以直接使用此方法来判断两个复杂类型,比如使用了泛型的列表对象List<T>、或者通过反射得到的对象,不清楚对象的具体类型。

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);
}
2.4. 返回一个整型数值,表示该对象的哈希码值。若参数对象为空,则返回整数0;若不为空,则直接调用了Object.hashCode方法。Object支持hashCode方法是为了提高哈希表(例如java.util.Hashtable 提供的哈希表)的性能。
    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }

以集合Set为例,当新加一个对象时,需要判断现有集合中是否已经存在与此对象相等的对象,如果没有hashCode()方法,需要将Set进行一次遍历,并逐一用equals()方法判断两个对象是否相等,此种算法时间复杂度为o(n)。通过借助于hasCode方法,先计算出即将新加入对象的哈希码,然后根据哈希算法计算出此对象的位置,直接判断此位置上是否已有对象即可。

2.5.为一系列的输入值生成哈希码,该方法的参数是可变参数。

    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }
2.6. 返回指定对象的字符串表示形式。如果参数为空对象null,则返回字符串“null”。
    public static String toString(Object o) {
        return String.valueOf(o);
    }
2.7. 返回指定对象的字符串表示形式。如果参数为空对象null,则返回第二个参数nullDefault所指定的对象。
    public static String toString(Object o, String nullDefault) {
        return (o != null) ? o.toString() : nullDefault;
    }
2.8. 如果两个参数相同则返回整数0。因此,如果两个参数都为空对象null,也是返回整数0。
注意:如果其中一个参数是空对象null,是否会抛出空指针异常NullPointerException取决于排序策略,如果有的话,则由Comparator来决定空值null。
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return (a == b) ? 0 :  c.compare(a, b);
    }

2.9.检查指定类型的对象引用不为空null。当参数为null时,抛出空指针异常。设计这个方法主要是为了在方法、构造函数中做参数校验。

    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

2.10.该方法是requireNonNull的重载方法,当被校验的参数为null时,根据第二个参数message抛出自定义的异常消息。

    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }
2.11. 检查指定的对象引用不为空null,如果是空,抛出自定义的空指针异常。从jdk1.8开始。 与requireNonNull(Object, String)方法不同,本方法允许将消息的创建延迟,直到空检查结束之后。 虽然在非空例子中这可能会带来性能优势, 但是决定调用本方法时应该小心,创建message supplier的开销低于直接创建字符串消息。

    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        if (obj == null)
            throw new NullPointerException(messageSupplier.get());
        return obj;
    }

2.12.判空方法,如果参数为空则返回true。从jdk1.8开始。

    public static boolean isNull(Object obj) {
        return obj == null;
    }

2.13判断非空方法,如果参数不为空则返回true。从jdk1.8开始。

    public static boolean nonNull(Object obj) {
        return obj != null;
    }




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ObjectObjects是Java中的两个不同的概念。 1. ObjectJava中所有类的基类。它是一个通用的引用类型,可以用来表示任何其他类的对象。所有的类都直接或间接地继承自Object类。Object类中定义了一些通用的方法,如equals()、hashCode()、toString()等,这些方法可以在所有的类中使用。 2. Objects是Java中的一个工具类,它提供了一些静态方法来操作对象。Objects类中的方法主要用于处理对象的比较、哈希码生成和空值处理等。其中,equals()方法用于比较两个对象是否相等,hashCode()方法用于生成对象的哈希码,toString()方法用于将对象转换为字符串表示。Objects类还提供了一些其他的方法,如requireNonNull()用于检查对象是否为空,isNull()和nonNull()用于判断对象是否为空等。 下面是一个示例代码,演示了如何使用ObjectObjects类: ```java import java.util.Objects; public class Person { private String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Person)) { return false; } Person other = (Person) obj; return Objects.equals(this.name, other.name); } @Override public int hashCode() { return Objects.hash(name); } @Override public String toString() { return "Person [name=" + name + "]"; } } public class Main { public static void main(String[] args) { Person p1 = new Person("Alice"); Person p2 = new Person("Bob"); System.out.println(p1.equals(p2)); // 输出:false System.out.println(Objects.equals(p1, p2)); // 输出:false System.out.println(Objects.hashCode(p1)); // 输出:961 System.out.println(Objects.toString(p1)); // 输出:Person [name=Alice] } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值