zoukankan      html  css  js  c++  java
  • HashMap 存储实现 过程

    源码:

    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()); ------(1)
    //计算key hash 值在 table 数组中的位置
    int i = indexFor(hash, table.length); ------(2)
    //从i出开始迭代 e,找到 key 保存的位置
    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 = value;
    e.recordAccess(this);
    return oldValue; //返回旧值
    }
    }
    //修改次数增加1
    modCount++;
    //将key、value添加至i位置处
    addEntry(hash, key, value, i);
    return null;
    }

    首先判断key是否为null,若为null,则直接调用putForNullKey方法。

    若不为空则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,如果table数组在该位置处有元素,则通过比较是否存在相同的key,若存在则覆盖原来key的value,否则将该元素保存在链头(最先保存的元素放在链尾)。若table在该处没有元素,则直接保存。

  • 相关阅读:
    WPF 绘图 和动画
    BZOJ 4028 分块
    操作系统与计算机网络
    go排序-基数排序
    go排序-睡眠排序
    go排序-堆排序
    go排序-构建大顶堆
    go排序 插入排序
    go排序-选择排序
    go排序-冒泡排序
  • 原文地址:https://www.cnblogs.com/weigy/p/12572835.html
Copyright © 2011-2022 走看看