简介:
Lua中,Table是很重要的一个部分,它可以表示很多的数据结构,可以是Array,可以是Map,可以根据自己的需要实现栈,队列等等,使用起来方便
分析:
Table分为2部分,分别是数组Array和Hash部分。
数组部分主要是存储下标从1开始的连续不为空的节点内容,如果是中间断开部分会存到hash部分。
Hash部分是存储各种类型的离散数据
对于一个Table初始化的时候,如果是空表,即Array和Hash部分长度都为0。
这里主要讲哈希的部分
然后根据哈希表的原理从后向前进行插入元素(开放定址法)
当哈希表的内存不够存储元素时,则申请元素,扩容的规则是每一次扩容翻倍,称为rehash
rehash的过程是:先分配一块新的内存块。然后,要把旧的迁移过来新内存块。但是,它并不是按顺序一个一个对位拷贝的,遍历每一个节点的时候,都要重新去进行一次哈希,所以分配前后的位置可能会不一样(它和Array部分不一样,Array部分是直接一对一,位置不变地拷贝的)
扩容前:
扩容后:
然后再在扩容后的位置去进行哈希
逻辑:
1:先去检查key所对应的哈希表位置是否为空,如果为空直接设置值
2:如果不为空,就在内存中找一个空的点,从最后往前找
3:如果找不到,则表示哈希表满了,调用一次rehash的方法,申请内存,并且重新设置一次之前的值
4:如果找到了,去计算该key点a本该存在的位置上的点b是否在其正确的位置上(即该点是否是通过开放定制法偏移过来的)
5:如果不是,则将b点放在空的结点位置去,a点放入计算好的位置上
6:如果b点在其正确的位置上,就将a插入空的位置