Java中的equals和hashCode

来源:互联网 发布:淘宝swot分析矩阵图 编辑:程序博客网 时间:2024/05/17 04:13

public boolean equals(Object obj)

Object类中对equals的默认实现方式是: return this == obj。 只有当this和obj引用同一个对象,才会返回true。

如果我们想判断两个对象是否等价而不是判断是否是同一个对象,就需要对equals进行重写。

按照约定,equals需要满足一下规则:

  • 自反性:x.equals(x) 返回true;
  • 对于null:x.equals(null) 返回false; (注意:null == null,返回true)
  • 对称性:x.equals(y) 和 y.equals(x)的结果一致;
  • 传递性:a和b equals, b 和 c equals,那么 a 和 c 也一定equals;
  • 一致性:在某个运行期间,两个对象的状态的改变不会影响equals的决策结果,那么,在这个运行期间,无论调用多少起equals都会返回相同的结果。

一个例子:

class Test{    private int num;    private String data;    public boolean equals(Object obj)    {        if (this == obj)            return true;        if ((obj == null) || (obj.getClass() != this.getClass()))            return false;           //能执行到这里,说明obj和this同类且非null。        Test test = (Test) obj;        //data是引用类型,所以在判断的时候,处理了字段为null的情况,如果不为空可以直接调用equals。       return num == test.num&& (data == test.data || (data != null && data.equals(test.data)));    }    public int hashCode()    {        //重写equals,也必须重写hashCode。具体后面介绍。    }}

  1. 在比较是否为同类时,在类没有子类时才可以使用instance,否则会影响对称性原则。
  2. 在具体比较对象的字段的时候,对于基本类型的字段,直接用==比较(注意浮点数的比较),对于引用类型的字段可以调用它们的equals(),需要处理字段为null的情况。对于浮点数的比较:
    if ( Double.doubleToLongBits(d1) == Double.doubleToLongBits(d2) ) //d1 和 d2 是double类型if(  Float.floatToIntBits(f1) == Float.floatToIntBits(f2)  )      //f1 和 f2 是d2是float类型
  3. 具体什么字段需要进行比较,要根据具体的业务需求来决定。
  4. equals的参数类型是Object。所以如果同类,且需要进一步比较字段值的话,则需要将Object类型转换成本类的类型,如第一段代码的第15行。

public int hashCode()

返回对象的int类型的散列码,散列码是用来支持java中基于哈希机制的集合类。

约定:等价的(equals)对象的散列码必须相同,也就是说,对象中用于衡量equals的字段需要参与散列码的计算。不等价的对象,散列码不必相同。

0 0
原创粉丝点击