您的位置:首页 > 编程语言 > Java开发

Java中hashCode()与equals()的问题

2017-09-29 18:15 393 查看
Suppose that you implement a data type OlympicAthlete for use in a java.util.HashMap:

我们以一个哈系表插入,取出的实现例子来看会比较清楚:

public class SeparateChainingHashST<Key, Value>{
private int M = 97;    // number of chains
private Node[] st = new Node[M];    // array of chains

private static class Node{
// 注意它们是Object
private Object key;
private Object val;
private Node next;
}

private int hash(Key key){
return (key.hashCode() & 0x7fffffff) % M;
}

public void put(Key key, Value val){
int  i = hash(key);
for (Node x = st[i]; x != null; x = x.next)
// x.val始终是Object
if (key.equals(x.key)) {x.val = val; return;}
st[i] = new Node(key, val, st[i]);
}

public Value get(Key key){
int i = hash(key);
for (Node x = st[i]; x != null; x = x.next)
// x.key 是Obj
if (key.equals(x.key)) return (Value) x.val;
return null;
}


Override hashCode() but not equals()

a) 对于void put(Key key, Value val)来说,对于引用不同但本质上是equal的key1, key2,会哈希到同一个bucket中,但两个都会保存下来,因为认为他们不是equal的。

b) 对于Value get(Key key)来说,对于引用不同但本质上是equal的key3,虽然会哈希到同一个bucket,但返回的是null。

Override equals() but not hashCode()

a) 对于void put(Key key, Value val)来说,对于equal的key1, key2,会哈希到不同的bucket中,因为hashCode()的默认实现是对象的地址。

b) 对于Value get(Key key)来说,对于equal的key3,会哈希到不同的bucket,返回的是null。

Override hashCode() but implement public boolean equals(OlympicAthlete that) instead of public boolean equals(Object that)

其实就跟情况1一样[Override hashCode() but not equals()],因为x.key是Object类型,所以key.equals(x.key)中只会调用默认equals(Object that),而不会调用equals(OlympicAthlete that)。

注意:默认的类型转换只发生在子类->父类

补充:Java中Overload和Override的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java