这段代码是否会将哈希部分添加到类似Lua数组的表中?

时间:2014-08-04 11:57:55

标签: arrays lua

Lua代码

local var = {} 

for i = 1, 10000, 1 do
    table.insert ( var, i )
end

var[5] = { some = false, another = 2 }
var[888] = @userdata
var[10000] = {}
var[1] = 1
var[1] = false

1)在此之后, var 仍然只有数组部分,或者它也有哈希部分吗?

2)代码

var[10001] = 1

将hash-part添加到 var ,还是只强制表重组而不添加hash-part?

3)它如何影响桌子的大小?

谢谢!

1 个答案:

答案 0 :(得分:1)

该表在1和2之后只有一个数组部分。原因是你有一组连续的索引。具体来说,您创建了1到10,001的条目,Lua将为它们分配空间。

例如,如果你创建了1到1000然后添加了10001,它就会在哈希部分中添加最后一个,而不是为所有条目之间创建nil条目。

您输入的数据类型与条目的值无关,Lua只对数组和散列之间的索引感兴趣。这里的例外是将值设置为nil。这可能会有点复杂,但如果表空间是您主要关注的问题,我不相信Lua会将数组中的哈希部分减少。我可能弄错了。

就尺寸而言,Lua使用倍增策略。因此,在您输入条目8192之后,Lua添加了另一个8192,因此在10000和10001之间没有创建额外的数组空间。

BTW Lua不会重新加入每个表格。当它添加桶时,它会给自己一些空间。我相信它也会在那里加倍。请注意,如果您的数据稀疏,即您不打算填充1和最大值之间的大多数索引,那么即使您的索引是数字,这种散列方法也可以非常有利于空间。主要缺点是它意味着您无法在所有条目中使用ipairs