table 在lua中是一个非常常用的数据结构,可以用来存放各种类型的元素,那么就会让人好奇,它这么强大,它是用什么数据结构实现的呢
首先,考虑 table = {1, 2, 3, 4, 5, 6, 7, 8} 这样的结构, 为了获得最快的访问速度,它是用数组实现的
那么如果执行table[10000] = 10; 莫非要创建10000个元素的数组,没有值的都存为nil,这样的空间利用效率太低无法接受,所有除了数组段之外,table还有一个哈希段,10000这个key会存在哈希段中,当太大的key值导致存储空间利用率低于50%时,这个值会被放进哈希段中。
此外,使用string或者0和负数做key时,key都是保存在哈希段。当table表满时,哈希段会扩大,所有段内的数据重新哈希。
lua的table使用数组和哈希表结合的方式,在空间效率和访问效率上都很好。
具体的代码示例:
1 -- 创建一个以string作为key的table, 存储在哈希表中 2 tbTable = {["Monday"] = 1, ["Tuesday"] = 2, ["Wednesday"] = 3, ["Tursday"] = 4, ["Friday"] = 5, ["Saturday"] = 6, ["Sunday"] = 7}; 3 4 -- 只能使用pairs遍历, 因为是用哈希算出存储位置,并非按照定义顺序存储 5 for k, v in pairs(tbTable) do 6 print(k, v) 7 end 8 9 --[[ 一组输出结果 10 Tursday 4 11 Tuesday 2 12 Wednesday 3 13 Friday 5 14 Sunday 7 15 Saturday 6 16 Monday 1 17 ]]-- 18 19 -- 在表中插入一组数字, 这些数字会存入数组区域中 20 for i = 1, 10, 1 do 21 table.insert(tbTable, i) 22 end 23 24 -- 可以使用ipairs将数组中的值遍历出来,不会访问到存在哈希表中的内容 25 for k, v in ipairs(tbTable) do 26 print(k, v); 27 end 28 29 --[[输出结果 30 1 1 31 2 2 32 3 3 33 4 4 34 5 5 35 6 6 36 7 7 37 8 8 38 9 9 39 10 10 40 ]]--