public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
类的每个实例从本质上来说是唯一的,如Thread类的实例。
2)我们并不会用到该类的equals方法,如Random类,虽然可以比较两个Random的实例,以判断两个实例是否可以产生相同的随机数,设计者认为这样的需求用到的场合很少,因而就没有重写equals方法。
3)父类已经实现了equals方法,并且父类实现方式和子类实现方式是一样的,如大部分的Set实现的equals方法使用AbstractSet类提供的equals方法,List实现则使用AbstractList,Map实现使用AbstractMap的。
4)一个private类或package-private类,我们自己可以确保我们不会使用到它们的equals方法。
同时书也提出一般只有值类型的类才需要实现equals方法,像Date、Integer、Order(作为bean来使用)等。
另外,我们在实现equals方法是也要遵循以下几个原则:
1)自反性(reflexive):x.equals(x)==true
2)对称性(symmetric):x.equals(y)==y.equals(x)
3)传递性(transitive):若x.equals(y)==true, y.equals(z)==true,则x.equals(z)==true。
4)一致性(consistent):多次调用x.equals(y)的结果应该是一样的。
5)对任何非null实例x,x.equals(null)==false。
特 性代码:如下
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String role;
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
if(this == obj) {
return true;
}
if(!(obj instanceof Customer)) {
return false;
}
Customer other = (Customer)obj;
return (ObjectUtils.equals(id, other.id) &&
ObjectUtils.equals(name, other.name) &&
ObjectUtils.equals(role, other.role));
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
其中ObjectUtils类的代码如下:
public class ObjectUtils {
/**
* Compare whether the left and right is equals
* It has already considered the null case
*
* @param left
* @param right
* @return
*/
public static boolean equals(Object left, Object right) {
if(left == null && right == null) {
return true;
}
if(left == null && right != null) {
return false;
}
return left.equals(right);
}
}
在《Effective
Java》这本书中,貌似equals实现方法前面没有null、this的判断,因为instanceof可以解决null的问题,而
super.equals()方法可以解决this问题,但是我还是喜欢把它们都分出来,这样写的更加明了一些。另外,事实上,这里的实现并没有遵循对称
性的原则,因为如果A是B的子类,而这个equals方法在A类中,那么AInstance.equals(BInstance)==false,若B也
实现了类似的equals方法,则BInstance.equals(AInstance)==true(当A没有新的比较字段时,或许这个时候A根本就
不需要实现equals方法,如本文开头列出的第三条),这是因为AInstance instanceof BInstance ==
true,反之则为false。不过由于这种情况并不常见,所以就不去care了。:)
分享到:
相关推荐
### 小结 `Object`类提供了许多基本而强大的功能,包括`toString()`、`equals()`、`hashCode()`、`getClass()`以及`clone()`等方法。通过理解和适当重写这些方法,开发者可以更好地控制对象的行为,并提高代码的...
小结 在 Java 中,== 操作符比较的是变量的值或地址值,而 equals() 方法比较的是对象的内容。对于基本类型的变量,== 操作符比较的是值是否相同;对于引用类型的变量,== 操作符比较的是地址值是否相同。equals() ...
学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器被调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154 5.8 继承与组合 154 ...
1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 ...
Java 工具类是一组常用的公共方法,帮助开发者简化代码和提高开发效率。下面总结了 16 个有用的 Java 工具类,涵盖 IO 操作、文件操作、字符串操作等多个方面。 一、org.apache.commons.io.IOUtils * closeQuietly...
#### 七、小结 通过上述介绍可以看出,Struts2 框架为开发者提供了一套完善的解决方案,包括表单处理、数据验证、异常处理、国际化等重要功能,大大降低了 Web 开发的复杂度,提高了开发效率。对于希望使用 Java ...