首页 > 代码库 > HashMap

HashMap

HashMap的定义
public class HashMap<K,V>          extends AbstractMap<K,V>          implements Map<K,V>, Cloneable, Serializable  {    ......   Entry[] table    ......  

Entry的定义

static class Entry<K,V> implements Map.Entry<K,V> {        final K key;        V value;        Entry<K,V> next;        final int hash;          .....

构造函数

public HashMap() {  this.loadFactor = DEFAULT_LOAD_FACTOR;  threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);  table = new Entry[DEFAULT_INITIAL_CAPACITY];  init();}

每次新建一个HashMap时,都会初始化一个table数组, table数组的元素为Entry节点

存put方法

public V put(K key, V value) {        //当key为null,调用putForNullKey方法,保存null与table第一个位置中,这是HashMap允许为null的原因        if (key == null)            return putForNullKey(value);        //计算key的hash值        int hash = hash(key.hashCode());                  //计算key hash 值在 table 数组中的位置        int i = indexFor(hash, table.length);            //从i出开始迭代 e,找到 key 保存的位置 ,这是hashMap无序的原因        for (Entry<K, V> e = table[i]; e != null; e = e.next) {            Object k;            //判断该条链上是否有hash值相同的(key相同)            //若存在相同,则直接覆盖value,返回旧value            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {                V oldValue = e.value;    //旧值 = 新值                e.value =http://www.mamicode.com/ value;                e.recordAccess(this);                return oldValue;     //返回旧值            }        }        //修改次数增加1        modCount++;        //将key、value添加至i位置处        addEntry(hash, key, value, i);        return null;    }

存的最终结果:

    Entry[ Entry ] table

数据机构:数组+链表散列
技术分享


取get方法

public V get(Object key) {        // 若为null,调用getForNullKey方法返回相对应的value        if (key == null)            return getForNullKey();        // 根据该 key 的 hashCode 值计算它的 hash 码          int hash = hash(key.hashCode());        // 取出 table 数组中指定索引处的值        for (Entry<K, V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {            Object k;            //若搜索的key与查找的key相同,则返回相对应的value            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))                return e.value;        }        return null;    }

参考: http://www.cnblogs.com/chenssy/p/3521565.html

HashMap