java中hashmap源码分析和实现
2014-08-30 21:19
771 查看
构造函数:
public HashMap() { table = (HashMapEntry<K, V>[]) EMPTY_TABLE; threshold = -1; // Forces first put invocation to replace EMPTY_TABLE }可以看到他其实是一个实体数组,来存储hasmap里面的元素的。
添加元素
@Override public V put(K key, V value) { if (key == null) { return putValueForNullKey(value); } int hash = Collections.secondaryHash(key); HashMapEntry<K, V>[] tab = table; int index = hash & (tab.length - 1); for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) { if (e.hash == hash && key.equals(e.key)) { preModify(e); V oldValue = e.value; e.value = value; return oldValue; } }
可以看到hash值的获得是通过:
Collections.secondaryHash(key)也就是要二次hash获得的,
private static int secondaryHash(int h) { // Spread bits to regularize both segment and index locations, // using variant of single-word Wang/Jenkins hash. h += (h << 15) ^ 0xffffcd7d; h ^= (h >>> 10); h += (h << 3); h ^= (h >>> 6); h += (h << 2) + (h << 14); return h ^ (h >>> 16); }
其中h为Key的hashcode.这样做的目的是为了让所有的位数都来参加hash。防止冲突
接着就是位置的获得:
int index = hash & (tab.length - 1);这里面很巧妙,因为tab.length-1与任何数想与都小于length.
相关文章推荐
- (10) java源码分析 ---- HashMap源码分析 及其 实现原理分析
- (10) java源码分析 ---- HashMap源码分析 及其 实现原理分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- [置顶] [Java容器]HashMap实现原理和源码分析
- [转]Java HashMap实现原理与源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析
- Java集合之HashMap源码实现分析
- 【Java集合学习系列】HashMap实现原理及源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- (转载)Java中HashMap底层实现原理(JDK1.8)源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- JAVA基础之HashMap实现原理及源码分析
- Java 源码分析HashMap的工作原理及实现
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java java.util.HashMap实现原理源码分析
- Java集合之HashMap源码实现分析
- Java集合之HashMap源码实现分析...