java.util.Objects
Objects 与 Object 区别
Object 是 Java 中所有类的基类,位于java.lang包。所有对象(包括数组)都实现此类的方法。
Objects 【public final class Objects extends Object】是 Object 的工具类,位于java.util包。它从jdk1.7开始才出现,被final修饰不能被继承,拥有私有的构造函数。
此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括 null 或 null方法 ,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。
Objects 方法介绍与分析
1、equals
equals方法 指某个其他对象是否“等于”此对象。(判断两个对象是否相等)
equals方法在非null对象引用上实现等价关系:
- 自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
- 对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。
- 传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true,然后x.equals(z)应该返回true 。
- 一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false,前提是未修改对象上的equals比较中使用的信息。
- 对于任何非空的参考值x , x.equals(null)应该返回false 。
在比较两个对象的时候,Object.equals方法容易抛出空指针异常。
首先我们来看看在Object类中定义的equals方法 [源码] ↓
可以看到其源码,在Object类型的equals方法是直接通过== 来比较的,和 ==是没有任何区别的。【故我们通常会重写Object类的equals方法】
请注意,Object类 通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。
a、使用对象的equals方法(Object)
运行结果:
所以,对于Object类,则“字符串常量与变量对象比较的时候,常量要写在equals外边,变量放在equals()括号里边。”就是这个原因。如果是两个变量比较的时候,就都需要加非空判断。b、使用Objects中的equals方法
注意理解这两个对象,这两个对象都不指向任何地址,也可以理解为都是一个“空指针”【null是没有内存空间的】。
现在,Objects.equals方法中已经做了非空判断,所以不会抛出空指针异常,它是null-save空指针安全的,而且也可以简化代码。
源码如下:
解释:可以比较两个基本数据类型的数值是否相等,而equals方法依旧调用的是Object对象中的方法,比较两个Object对象的地址值是否引用的同一块地址【因为由Object类的equals方法的源码可以看出实际上就是“==”的比较】,如果不同则为false。
2、deepEquals
顾名思义,深度比较两个对象。
如果两个对象是深层相等,那返回true,否则返回false。
当参数是数组对象,其方法内部采用的是Arrays.deepEquals0方法的算法。
使用Objects.deepEquals方法有个好处,当我们在写业务代码时,可以直接使用此方法来判断两个复杂类型,比如使用了泛型的列表对象List、或者通过反射得到的对象,不清楚对象的具体类型。
源码如下:
解释:Objects中还有一个deepEquals(Object x,Object y)的方法,此方法的功能比较强大,不仅可以比较数值是否相同,而且还可以比较两个对象中的内容是否相同,如果相同即为true。
简短的说明下Arrays.deep