前言
当《阿里巴巴Java开发手册》发布后,我也是仔细进行了阅读,想从中找出一些“标准”,让自己的代码质量提高。手册中对 Object
的 equals
方法的使用进行了强制,而且推荐使用 JDK7 中工具类 Objects
的 equals
方法,至此之后我就很少使用 Object.equals()
方法了。
一、Java开发手册说明
在第一章:编程规约 -> 第四节:OOP规约 -> 第6条内容如下图:
这里说 Object.equals()
方法容易抛空指针异常,空指针异常相信大家并不陌生,应该使用确定有值的对象来调用 equals()
方法,不能无中生有,不能从 null
调用方法,还举了正例与反例。最后推荐使用 Objects.equals()
方法。
二、Object.equals()方法
Object.equals()
方法是 Java 语言中的一个基础方法,用来比较两个对象是否相等。以下是它的源代码实现:
public boolean equals(Object obj) {
return (this == obj);
}
这个方法的实现非常简单,它首先用引用比较来检查传递给它的参数对象是否是当前对象本身,如果是,则返回 true
,表示两个对象相等。否则,它返回 false
,表示两个对象不相等。
我们需要注意的是,Object
的 equals()
方法是根据对象的引用来判断两个对象是否相等的,而不是根据对象的内容。如果我们要比较两个对象的内容是否相等,我们需要重写 equals()
方法,这样就可以根据对象的具体内容来判断它们是否相等了。
比如 Java 中的字符串类 String
就是通过重写 equals()
方法来实现字符串内容的比较的。例如,以下代码比较两个字符串的内容是否相等:
String str1 = new String("你好");
String str2 = new String("你好");
// 比较两个字符串的内容是否相等
if(str1.equals(str2)) {
System.out.println("这两个字符串内容相等。");
}
else {
System.out.println("这两个字符串内容不相等");
}
执行结果为:
这两个字符串内容相等。
三、Objects.equals()方法
Java 中的 Objects.equals()
方法实际上是由 Java 中的 Objects
类提供的静态方法,以下是它的源代码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
这个方法的实现非常简洁,它首先通过引用比较来检查传递给它的两个对象是否相同。如果相同,它直接返回 true
。否则,它进一步检查第一个参数是否为 null
,如果为 null
,则返回 false
。否则,它调用第一个参数的 equals()
方法来比较两个对象的内容是否相同。
我们需要注意的是,这个方法中使用的是逻辑或运算符(||
)。首先检查第一个条件是否为 true
,只有当第一个条件为 false
时才会执行第二个条件。这种方式在 Java 中有时被称为"short-circuiting"。这里也就是短路或,这种技巧可以用来提高代码的效率,避免执行不必要的操作。
Objects.equals()
方法是 Java 中用于比较两个对象是否相等的一个实用工具方法,它可以处理对象为 null
的情况,避免了因对象为 null
而产生 NullPointerException
的问题。具体来说,如果两个参数都是 null
,则返回 true
;如果一个参数是 null
而另一个不是 null
,则返回 false
;否则,调用第一个参数的 equals
方法进行比较。这样就避免了空指针异常了。
四、Objects.equals()和Object.equals()
Java 中的 Objects.equals()
和 Object.equals()
方法都用于比较两个对象是否相等,但是它们之间还是有一些差异的。
- 对比 null 值:
Objects.equals()
方法可以比较null
值,而Object.equals()
方法不能比较null
值,如果比较null
值,将会抛出NullPointerException
。 - 实现原理:
Objects.equals()
方法内部调用的是第一个对象的equals()
方法进行比较,如果第一个对象为null
,则直接返回与第二个对象比较的结果。而Object.equals()
方法直接比较两个对象的引用是否相同。 - 参数类型:
Objects.equals()
方法的两个参数可以是任意类型,而Object.equals()
方法的参数必须是Object
类型。
总结
建议使用 JDK7 中工具类 Objects
的 equals
方法。