Java中hashCode()与equals()的问题
2017-09-29 18:15
393 查看
Suppose that you implement a data type OlympicAthlete for use in a java.util.HashMap:
我们以一个哈系表插入,取出的实现例子来看会比较清楚:
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的区别
我们以一个哈系表插入,取出的实现例子来看会比较清楚:
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问题,(x.equals(y) == true)有相同的hashCode 应该是不一定
- JAVA中的== equals hashcode问题
- Java hashCode() 和 equals()的若干问题解答
- Java hashCode() 和 equals()的若干问题解答
- Java 提高篇——equals() 与 hashCode() 方法详解 Java hashCode() 和 equals() 的若干问题解答
- Java中hashCode() equals() 与将对象放入集合或者说Map时要考虑的问题
- Java hashCode() 和 equals()的若干问题解答
- "java.util.NoSuchElementException: No value present" 问题解决:重写hashCode 和 equals 方法
- Java中hashCode() equals() 与将对象放入集合或者说Map时要考虑的问题
- JAVA中的== equals hashcode问题
- Java中String类hashCode()和equals()问题
- java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系
- Java的Object的equals和hashCode函数与集合类联合使用的问题解决方案
- Java中的hashCode() 和 equals()的若干问题解答
- Java中的hashCode() 和 equals()的若干问题解答
- java hashcode() 和equals()详解 以及set不能重复问题
- Java基础之 与equals()如影随行的hashCode()
- java中hashcode()和equals()的详解
- Java 从写equals 和 hashcode
- java中==和equals问题