zoukankan      html  css  js  c++  java
  • 2020-12-05:go中,map的扩容流程是什么?

    福哥答案2020-12-05:[答案来自此链接:](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=13)

    源码位于runtime/map.go文件中的hashGrow函数。

    在向map中添加数据时,当达到某个条件,则会引发字典扩容。

    扩容条件:
    1.map中数据总个数/桶个数>6.5,引发翻倍扩容。mapassign中的overLoadFactor函数。
    2.使用了太多的溢出桶时(溢出桶使用的太多会导致map处理速度降低)。mapassign中的tooManyOverflowBuckets函数。
    B<=15,已使用的溢出桶个数>=2的B次方时,引发等量扩容。
    B>15,已使用的溢出桶个数>=2的15次方时,引发等量扩容。

    当扩容之后:
    1.B会根据扩容后新桶的个数进行增加(翻倍扩容 新B=旧B+1,等量扩容 新B=旧B)。
    2.oldbuckets指向原来的桶(旧桶)。
    3.buckets指向新创建的桶(新桶中暂时还没有数据)。
    4.nevacuate设置为0,表示如果数据迁移的话,应该从原桶(旧桶)中的第0个位置开始迁移。
    5.noverflow设置为0,扩容后新桶中已使用的溢出桶为0。
    6.extra.oldoverflow设置为原桶(旧桶)已使用的所有溢出桶。即:h.extra.oldoverflow = h.extra.overflow。
    7.extra.overflow设置为nil,因为新桶中还未使用溢出桶。
    8.extra.nextOverflow设置为新创建的桶中的第一个溢出桶的位置。

  • 相关阅读:
    Android数据存储之Application
    contentOffset、contentSize和contentInset
    block
    IOS中的深拷贝和浅拷贝
    手势图的设计原理(2)拖拽、捏合、轻扫、旋转
    深浅拷贝的应用-copy、mutableCopy
    手势图的设计原理(1)建立、开始、移动、结束、点击、长按
    UIView
    MVC-Model
    UIPageControl页面控制的控件
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14091182.html
Copyright © 2011-2022 走看看