Objects类源码理解

34 篇文章 0 订阅


前言

本文章帮助大家对Objects类的理解。


一、概述

Objects意为对象(复数)。顾名思义,对象相关。此类仅开放静态方法,不能生成实例,作为一个对象相关的工具类。它提供操作、检查对象等的基础方法,如比较、哈希码、字符串转换、判空、检查下标等,若需要对一个、两个或多个“或空”对象使用这些基础功能,建议使用该工具类。

参考Objects(jdk18)

二、源码理解

package java.util;
import java.util.Objects;

使用Objects类时,需引入此包。

Objects类

public final class Objects { /*...*/ }

final类,无法继承。

Objects方法

Objects

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

构造函数私有化,使用户无法用此方法进行实例化。由于其它方法基本都是静态方法,所以将此类作为工具类使用即可,无需实例化。类内部使用此方法也将抛异常。

equals

public static boolean equals(Object a, Object b) { /*...*/ }

静态方法。判断两个“或空”对象是否相同(引用相同)。

deepEquals

public static boolean deepEquals(Object a, Object b) { /*...*/ }

静态方法。判断两个“或空”对象是否相同,或当其均为数组(或多层数组)时,递归地判断最底层元素是否均对应相同,即为深度相等。

其中使用到Arrays.deepEquals0方法,参考Arrays.deepEquals0方法。

hashCode

public static int hashCode(Object o) { /*...*/ }

静态方法。返回对象的哈希码,若为空对象,返回0。一个对象的哈希码通常不改变。若两个对象相同,则其哈希码相等;反之不然。通常可以用来帮助查找。

其中使用到Object.hashCode方法,参考Object.hashCode方法。

hash

public static int hash(Object... values) { /*...*/ }

静态方法。返回对象序列的哈希码,若对象序列为空,返回0;若对象序列仅含一个对象,返回值不等于此对象的哈希码。且改变对象顺序后返回结果不同。此方法可以用来重写实现某对象的哈希码(若此对象有若干成员,将这些成员作为参数传入,得到结果作为此对象的哈希码)。

其中使用到Arrays.hashCode方法。计算公式为(其中 v i v_{i} vi 为参数values的第 i i i个元素的哈希码, n n n 为对象数量):
3 1 n + 3 1 n − 1 ∗ v 0 + … … + 31 ∗ v n − 2 + v n − 1 31 ^ {n} + 31 ^ {n-1} * v_{0} + …… + 31 * v_{n-2} + v_{n-1} 31n+31n1v0+……+31vn2+vn1
参考Arrays.hashCode方法。

toString

public static String toString(Object o) { /*...*/ }

静态方法。将对象“转换”为字符串,若对象为空,返回“null”;其它情况返回 类名 + “@” + 哈希码的十六进制。

其中使用到Object.toString方法,参考Object.toString方法。

public static String toString(Object o, String nullDefault) { /*...*/ }

静态方法。将对象“转换”为字符串,同toString(Object o),不同的是,若对象为空,返回参数nullDefault

compare

public static <T> int compare(T a, T b, Comparator<? super T> c) { /*...*/ }

静态方法,传入泛型T,为比较参数的类型。比较两个对象,若两个对象相同,返回0;其它情况返回比较器c的比较结果。若要使用自定义比较器,需实现Comparator接口的compareequals方法。参考Comparator接口。

requireNonNull

public static <T> T requireNonNull(T obj) { /*...*/ }

静态方法,传入泛型T,为检查对象和返回对象的类型。检查对象是否为空并返回对象,若对象为空,抛出NullPointerException异常。

public static <T> T requireNonNull(T obj, String message) { /*...*/ }

静态方法,传入泛型T,为检查对象和返回对象的类型。检查对象是否为空并返回对象,同requireNonNull(T obj),不同的是,若对象为空,抛出带message信息的NullPointerException异常。

public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) { /*...*/ }

静态方法,传入泛型T,为检查对象和返回对象的类型。检查对象是否为空并返回对象,同requireNonNull(T obj),不同的是,若对象为空,且信息供应器messageSupplier非空,抛出带messageSupplier.get()信息的NullPointerException异常。若要使用自定义供应器,需实现Supplier接口的get方法。参考Supplier接口。

isNull

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

静态方法。判断对象是否为空。

nonNull

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

静态方法。判断对象是否非空。

requireNonNullElse

public static <T> T requireNonNullElse(T obj, T defaultObj) { /*...*/ }

静态方法,传入泛型T,为检查对象和返回对象的类型。类似requireNonNull方法,检查对象是否为空并返回对象obj,若obj为空,判断defaultObj并返回对象defaultObj,若defaultObj也为空,抛出带"defaultObj"信息的NullPointerException异常。

requireNonNullElseGet

public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) { /*...*/ }

静态方法,传入泛型T,为检查对象和返回对象的类型。类似requireNonNullElse方法,检查对象是否为空并返回对象obj,若obj为空,判断供应器supplier并返回对象supplier.get(),若supplier也为空,抛出带"supplier"信息的NullPointerException异常,若supplier.get()也为空,抛出带"supplier.get()"信息的NullPointerException异常。

checkIndex

public static int checkIndex(int index, int length) { /*...*/ }

静态方法。检查下标index是否越界(小于0或大于等于length,当然若length小于等于0,必有前面两种情况之一)并返回index,若越界,抛出IndexOutOfBoundsException异常。

checkFromToIndex

public static int checkFromToIndex(int fromIndex, int toIndex, int length) { /*...*/ }

静态方法。检查下标fromIndextoIndex是否越界(小于0或大于length)且fromIndex是否大于toIndex,并返回fromIndex,若越界或fromIndex大于toIndex,抛出IndexOutOfBoundsException异常。

checkFromIndexSize

public static int checkFromIndexSize(int fromIndex, int size, int length) { /*...*/ }

静态方法。检查下标fromIndexfromIndex + size是否越界(小于0或大于length)且size是否小于0,并返回fromIndex,若越界或size小于0,抛出IndexOutOfBoundsException异常。


总结

新人源码理解,望大家多多指点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值