当《阿里巴巴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类型。