乱写 hashcode equalse

来源:互联网 发布:冒险岛mac地址 编辑:程序博客网 时间:2024/06/16 10:28

关于重写equals   hashcode 一级cmpareTo方法

Object的 equalse 方法比较的是地址值

string  Math 还有Integer Doubler  这些封装类重写了Object 中的quualse方法

让他不在比较句柄,(引用) ,而是比较对象中世纪包含的整数的值,即比较的是内容。,

一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equalse 方法和hashcode方法

因为容器中首先比较的hashcode方法, 因为equalse方法还需要强转,效率不行


我们应该先了解java判断两个喜爱你过是否相等的规则, 在java 集合中,判断两个兑现是否相等的规则是:

首先判断两个对象的hashcode是否相等

如果不相等,认为两个对象也不行iandeng如果相等,泽调用对象的equalse运算是否相等

如果不相等,认为两个对象也不相等


我们在equalse方法中需要向下转型, 效率很低, 所以先判断hashcode方法可以提交效率


Objec中 equalse的定义

public  boolean  equalse(Object  obj){

     return  this == obj

}

我们还应该注意,java语言对equalse的要求如下,浙西诶要求是必须遵循的,

对称性: 如果x.equalse(y) 返回的是true 那么y.equalse(x)也应该放回true

反射性 x.equalse(x) 必须翻译是true

类推行  如果x.equalse(Y) 返回是true ,而且 y.equalse(z) 返回是true  那么z.equalse(x)也应该返回true

还有一致性,  如果x.equals(y) 返回true 




七尺是hashcode方法 在object类中定义如喜爱:

public native int  hashcode();

说明是一个本地方法,它的实现是根据本地机器相关的,当让我们可以再自己写的类中覆盖hashcode方法

比如string Inter  Double等等这些类都是覆盖了hashcode方法的

  public  int hashcode(){

 int h = hash;

if(h== 0) {

  int  off = offset

char val [] = valse 

int len= count

  for(int i =0 ;i< len;i++){ h= 31*h + val[off++];}

 hash =h;

}


}

3在这里我们要明白一个问题

 equalse 相等的两个对象,hashcode 不一定相等

equalse不相等的两个对象,却不能证明他们的hashcode不相等,换句话说。equalse方法不相等的两个对象

hashcode有可能相等。


在java集合中

判断两个对象是否相等的规则是:

 1、判断了i昂个对象的hashcode是否相等

  如果不相等,认为两个对象也不相等,完毕

如果相等,转入2

这一点是为了提高存储效率的,

如果hachdeode相等

在判断equalse运算是否相等









0 0
原创粉丝点击