java.lang.String下equals方法的小结.
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了。:)
上一篇: Quartz的使用
下一篇: 关于Java中String类的相关方法
推荐阅读
-
java.lang.String下equals方法的小结.
-
equals方法的注意事项
-
访问Oracle Spatial中的SDO_GEOMETRY字段的方法(windows下) 博客分类: Oracle OracleWindowsSQL.netJDBC
-
IE下ext树根节点没有反色、无选中状态的bug修复方法 博客分类: ExtJS IEEXTCSS
-
IE下ext树根节点没有反色、无选中状态的bug修复方法 博客分类: ExtJS IEEXTCSS
-
CentOS下安装JDK的三种方法 博客分类: 【25】、linux【51】、centos jdkcentos
-
java中的equals()方法
-
Windows下mysql忘记root密码的解决方法(转) 博客分类: 数据库
-
Object类的equals方法和hashCode方法 博客分类: Java基础 javaequalshashCode
-
Centos下解压rar、zip文件的方法 博客分类: centos rar 解压 centos rar