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了。:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值