`
农村哥们
  • 浏览: 286824 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

equals()对象的比较;hashcode()方法

 
阅读更多
一、
String s1 = "abc";
String s2 = "abc";
s1 == s2        true; 
比较的是引用、物理地址。这样定义通过缓存机制,实际是只申请了一个内存地址,所以相等。

String s3 = new String("abc");
String s4 = new String("abc");
s3 == s4        false;
这样定义是申请了两个内存地址,所以不相等。

s1.equals(s2)   true;
s3.equals(s4)   true;

Object 存在equals()方法执行的是比较两个Object的内存地址。因为所有的类都继承Object,所以都隐藏包含着equals()方法比较内存地址。但String 类复写了equals() 方法,它的策略是比较value,s1,s2,s3,s4内存都是abc所以是相等。

对于一般的类都会复写equals()有自己的比较策略。当我们自己创建类时候,也同样需要复写equals()满足我们的业务要求。否则默认是比较对象的内存地址。
例如:
class vo {
  private Integer id;
  private Integer name;

  public Integer getId(){
      return id;
  }
  public void setId(Integer id){
      this.id = id;
  }
  ..........getName
  ..........setName

   public boolean equals(Object other){
      if(this == other){
         return true;
      }
      if(!(other instanceof vo)){
         return false;
      }
      vo o = (vo)other;
      return this.getId == o.getId;
   }

  public int hashcode(){
      return this.getId()+100;
  }
}
复写的 equals() 策略是如果两个object的 id 相等就认为两个对象是相等的,即使name不等。所以复写的方法完全按照自己的业务需求来制定。

按照国际惯例也要加上下面这段
在重写equals方法时,要注意满足离散数学上的特性

1、自反性   :对任意引用值X,x.equals(x)的返回值一定为true.
2    对称性:   对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3    传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false



二、
hashcode() 是创建对象自动生成的标识,为了索引等便利于快捷。
Object 类带有生成 hashcode 策略,每次new 一个新的对象都会生成一个不同的hashcode。应用在hashMap,hastTable 等地方为索引用。

当然也可以复写hashcode(),自己制定生成hashcode策略。
例如:
class vo {
  private Integer id;
  private Integer name;

  public Integer getId(){
      return id;
  }
  public void setId(Integer id){
      this.id = id;
  }
  ..........getName
  ..........setName

  public boolean equals(Object other){
      if(this == other){
         return true;
      }
      if(!(other instanceof vo)){
         return false;
      }
      vo o = (vo)other;
      return this.getId == o.getId;
   }

  public int hashcode(){
      return this.getId()+100;
  }

}
制定hashcode生成是 id + 100 .

一般有这么一个规定:
两个object 如果 equals() 相等,他们的hashcode也相等;如果equals()不相等,他们的hashcode不一定相等或者不等;他们的hashcode相等或者不等也决定不了equals()相等或者不等。

重写hashCode是为了集合类存储这些对象的时候有个比较规则
比如Map不允许重复元素,就是通过hashCode来检测的
这就是为什么复写equals()时候也要复写hashcode()。如果不一同复写,equals()比较两个对象相等,但hashcode是产生的不等,在使用hashmap 等 集合类索引就会出问题。
分享到:
评论
1 楼 小牛100 2016-01-02  
不错,明白了

相关推荐

Global site tag (gtag.js) - Google Analytics