hashmap重写key的hashcode问题
2015-04-12 18:31
323 查看
今天看到这样一个问题:
/**补充完该类,不修改main方法,使得get()方法可以取到值*/
来源: <http://xtwxgh.iteye.com/blog/78459>
测试发现重写student的hashcode也不能重现,本以为hashmap只通过hash后的index作为寻找value的策略,结果还是不行
看源码get方法发现下面,
key除了通过hash比较,还要比较本身key和查询key,下面的代码展示Entry除了要记录hash还要记录hash时的Key(object类型)
总结:
对于hashcode,一般是不推荐重写的,而hashcode本身也是为了对于hashmap这类需要使用hash算法的对象而产生的,如果非要按照自己的需求去实现key,value映射,必须要修改Hashmap中的get等方法,单纯修改key的hashcode算法是不够
/**补充完该类,不修改main方法,使得get()方法可以取到值*/
package test; import java.util.HashMap; import java.util.Map; public class StudentTest { private static final class Student { private static String name; public Student(String name) { this.name = name; } } public static void main(String[] args) { Map p = new HashMap(); p.put(new Student("lily"), "sister"); System.out.println(p.get("lily")); System.out.print(p.keySet().iterator().next()); } }
来源: <http://xtwxgh.iteye.com/blog/78459>
测试发现重写student的hashcode也不能重现,本以为hashmap只通过hash后的index作为寻找value的策略,结果还是不行
看源码get方法发现下面,
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; }
key除了通过hash比较,还要比较本身key和查询key,下面的代码展示Entry除了要记录hash还要记录hash时的Key(object类型)
final Entry<K,V> getEntry(Object key) { if (size == 0) { return null; } int hash = (key == null) ? 0 : hash(key); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && ))) return e; } return null; }
总结:
对于hashcode,一般是不推荐重写的,而hashcode本身也是为了对于hashmap这类需要使用hash算法的对象而产生的,如果非要按照自己的需求去实现key,value映射,必须要修改Hashmap中的get等方法,单纯修改key的hashcode算法是不够
相关文章推荐
- HashMap中 hashcode()方法和equels()方法重写问题
- override equals后也要override hashcode方法,否则hashmap,hashset,hashtable这三个集合中的操作会出问题。 (其他情况下,不重写hashcode没)
- HashMap将对象作为key为什么需要重写equals和hashcode方法
- 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。
- HashMap中的key为什么不能为可变对象(除非重写它的hashcode方法和equals方法)
- 源码剖析HashMap--当key为Object时为什么要重写hashcode与equals方法
- HashMap和HashSet中hashCode()和equals()方法重写的问题
- 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。
- hashset中equals和hashcode方法重写问题
- GetTypeHashCode() 没有找到适合的方法来重写等问题
- java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- 在使用hashmap时遇到不同key也会覆盖的问题
- 重写equals方法以及hashcode方法注意的问题
- java HashMap插入重复Key值问题
- 对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法
- 浅谈HashMap以及重写hashCode()和equals()方法
- java HashMap插入重复Key值问题
- hashtable里面关于equals和hashcode的覆盖重写问题