安卓学习笔记 6-8 hashmap底层实现

hashmap分析

=============hashmap简介===================

我们可以往hashmap中添加键值对,也可以通过key来获取value

当插入数据时,会先判断是否有足够的容量

如果不够,就扩容为到原来容量的两倍

够的话就先判断key是否为空,如果为空就插入到那个空的键值对

不为空就按照键值对直接插入


==========put方法分析===============

public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
        inflateTable(threshold);
    }
    if (key == null)
        return putForNullKey(value);
    int hash = sun.misc.Hashing.singleWordWangJenkinsHash(key);
    int i = indexFor(hash, table.length);
    for (HashMapEntry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}


先解析了一个hashmap,然后检测key是否为空,为空就往key为空的那个键值对中插入值

然后通过hash值和整个数组的长度获得数组总长度(不太明白为什么这么做)

不为空就判断key的hash值与参数中传递的key的hash值是否相同,以及key是否与参数中传递的相同

然后就往指定key里面放对应的值

==========获取hashmap中某个key对应的value==========

安卓学习笔记 6-8 hashmap底层实现)

这个方法首先会判断key是否为空,为空就直接从key为空的那个键值对中获取值

不为空就通过与运算和指定key的hash值来获得下标,然后通过下标获得值




第一篇博客就这样结束吧,明天继续加油!!!