Hash简介
HashCode是哈希码。
HashCode由Hash函数得到。
加入有两个10G的文件。可以把他们当成2个10吨的猪肉。
而Hash算法就是绞肉机。
当Hash算法真正的发挥了作用的时候,这10吨肉就被剿成了很少但完全不同的int类型的编码。而根据这串编码就可以区别楚这10吨肉。
Hash表:通过Hash函数得到的HashCode组成的集合。
根据对象的物理地址,
转化为一个整数。
根据Hash函数,把这串整数,
转化成HashCode,存放于Hash表中。
Hash算法核心
算法核心:Hash算法仅仅是将对象进行分组,这样当对象成百上千的时候就会容易筛选出来。可是每一组不一定有一个对象。–每一组就是一个HashCode。但不同的地址也可以生成相同的HashCode。怎么办呢?
public boolean equals(Object obj){
return (this == obj);
}
这是原来的equals。
如果不重写equals,那么就会导致可能两个对象会一样。
HashCode于equals之间的相等关系
如果两个对象的equals相等,那么必定HashCode也相等。
如果两个对象的HashCode相等,不一定equals相等。
为什么重写equals时也要重写HashCode方法?
因为重写了equals方法后,两个对象若相等,不能保证根据原来的HashCode方法得出完全相同的HashCode。因此最好重写HashCode方法。
String类默认重写了hashCode和equals。
java里面找对象当然是按照hashcode码来的,这样才效率高。
但一个类创建的两个对象,属性完全一样,如果没有重写hashcode方法,他们的hash码不一样。
我们当然希望这两个对象的hash码相等。因此重写hashcode方法就可以保证同一个类创建完全一样的对象时他俩的地址是一样的。
但由hash算法,很可能其他类创建的对象和你有同样的hash码。这个时候写equals保证了在类这一级别独立。
重写equals | 重写hashcode | 两个类创建的两个对象比 | 一个类创建的两个对象比 |
---|---|---|---|
false | false | hashcode可能相等,equals->false | hashcode可能相等,equals->false |
false | true | hashcode可能相等,equals->false | if(ObjA.所有属性==ObjB.所有属性) then hashcode一定相等,equals->false |
true | false | hashcode可能相等,equals->false|true | if(ObjA.所有属性==ObjB.所有属性) then hashcode可能相等,equals->true |
true | true | hashcode可能相等,equals->false | if(ObjA.所有属性==ObjB.所有属性) then hashcode一定相等,equals->true |