初学hashmap数据结构2

remove方法

public V remove(Object key) {
    Entry<K,V> e = removeEntryForKey(key);  //返回与key相同的前一个值,
    return (e == null ? null : e.value);
}
final Entry<K,V> removeEntryForKey(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode()); //计算hash值
    int i = indexFor(hash, table.length); //算出hash值在table中的索引
    Entry<K,V> prev = table[i]; //获取索引值
    Entry<K,V> e = prev;

    while (e != null) {
        Entry<K,V> next = e.next;
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k)))) {
            modCount++; //hashmap结构变化加1
            size--;// 大小减1
            //如果匹配到,则将以一个值移到这里,hashmap数据结构为数组加链表
            if (prev == e)  
                table[i] = next;
            else
                prev.next = next;
            e.recordRemoval(this);
            return e;
        }
        prev = e;
        e = next;
    }

    return e;
}
  //hashmap判断是否包含其中一个值
    public boolean containsValue(Object value) {
    if (value == null)
        return containsNullValue();

    Entry[] tab = table;
    for (int i = 0; i < tab.length ; i++)
        for (Entry e = tab[i] ; e != null ; e = e.next)
            if (value.equals(e.value))
                return true;
    return false;
}
 //清空操作是将每个对象设置为null,数组大小设置为0
   public void clear() {
      modCount++;
    Entry[] tab = table;
    for (int i = 0; i < tab.length; i++)
        tab[i] = null;
    size = 0;
}

猜你喜欢

转载自blog.csdn.net/sliping123/article/details/82898672