资讯专栏INFORMATION COLUMN

二、数据的存放put

simpleapples / 2688人阅读

摘要:辅助先将赋值给如果为空或长度为先用为其分配空间为的长度先给赋值没有哈希值冲突如果出现了哈希值数组下标重复则用于记录新的数据应该在的位置如果关键字和桶中的数据重复如果桶后所连为红黑树如果桶后所接为普通链表无限循环直到插在链表的最后如果链表

public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
    Node[] tab; 
    Node p; //辅助
    int n, i;
    if ((tab = table) == null || (n = tab.length) == 0)
        n = (tab = resize()).length;
    /*先将table赋值给tab,如果table为空或长度为0,先用resize()为其分配空间,n为table的长度*/
    if ((p = tab[i = (n - 1) & hash]) == null)   //先给p赋值
        tab[i] = newNode(hash, key, value, null);//没有哈希值冲突 
    else {  //如果出现了哈希值(table数组下标)重复则..
        Node e; //用于记录新的数据应该在的位置
        K k;
        if(p.hash==hash&&((k=p.key)==key||(key!=null&& key.equals(k))))
         //如果关键字和桶中的数据重复  
            e = p; 
        else if (p instanceof TreeNode)//如果桶后所连为红黑树                
            e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);
        else {//如果桶后所接为普通链表
            for (int binCount = 0; ; ++binCount) {//无限循环直到break
                if ((e = p.next) == null) {
                    p.next=newNode(hash, key, value, null);//插在链表的最后
                    if (binCount >= TREEIFY_THRESHOLD - 1) //如果链表长度不小于8 ,利用下面的函数将其转换为红黑树                           
                        treeifyBin(tab, hash);
                    break;
                }//链表遍历完发现没有重复的关键字 
                if (e.hash == hash &&((k = e.key) == key || (key != null&& key.equals(k))))
                    break;  //链表中有重复关键字
                p = e; //让p等于p的next,实现遍历
            }
        }
        if (e != null) { //有重复的关键字
            V oldValue = e.value;
            if (!onlyIfAbsent || oldValue == null)
                e.value = value;//新值替代旧值
            afterNodeAccess(e);
            return oldValue;//返回旧值(被替代的值)
        }
    }
   //如果没有重复的关键字(将要插入一条新的数据)
    ++modCount;
    if (++size > threshold)
        resize();
    afterNodeInsertion(evict);
    return null;}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69983.html

相关文章

  • Java基础知识整理之操作Redis(三)

    摘要:如果键不存在,则执行压栈操作之前创建的空列表。声明当前类注教程的中文网官网附基础知识整理之操作一基础知识整理之操作二 Java操作Redis之操作数据 1.操作 String 1.1 源码 public void stringOperator(){ //添加数据 jedis.set(name, Wayfreem);// 添加一个 key 为 n...

    fanux 评论0 收藏0
  • 学习数据结构与算法之字典和散列表

    摘要:小结实现了字典和哈希表感觉没有想象中那么困难,当然这还是开始。 本系列所有文章:第一篇文章:学习数据结构与算法之栈与队列第二篇文章:学习数据结构与算法之链表第三篇文章:学习数据结构与算法之集合第四篇文章:学习数据结构与算法之字典和散列表第五篇文章:学习数据结构与算法之二叉搜索树 字典 不是新华字典哦,这里的字典也称作_映射_,是一种数据结构,跟set集合很相似的一种数据结构,都可以用来...

    Heier 评论0 收藏0
  • 动手实现一个 LRU cache

    摘要:不过其中的流程算是一个简易的实现,可以对加深一些理解。实现二因此如何来实现一个完整的缓存呢,这次不考虑过期时间的问题。缓存数量超过阈值时移除链表尾部数据。 showImg(https://segmentfault.com/img/remote/1460000014229173?w=1408&h=872); 前言 LRU 是 Least Recently Used 的简写,字面意思则是最...

    Cc_2011 评论0 收藏0
  • map集合学习

    摘要:提供了专门的集合类用来存放这种对象关系的对象,即接口。中的集合,元素是成对存在的理解为夫妻。中的集合称为单列集合,中的集合称为双列集合。根据指定的键,在集合中获取对应的值。 day04 【Map】 主要内容 Map集合 教学目标 [ ] 能够说出Map集合特点 [ ] 使用Map集合添加方法保存数据 [ ] 使用键找值的方式遍历Map集合 [ ] 使用键值对的方式遍历Map集合 [ ...

    peixn 评论0 收藏0

发表评论

0条评论

simpleapples

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<