本來想自己寫一下,不小心看到了大佬的一篇文章,非常詳細全面。
偽**概要
if 陣列最後一位 == nil then
則二分查詢往前找到乙個不是nil的返回長度
else
if 陣列最後一位 ~
=nil and 雜湊桶部分 == nil then
return 陣列長度
else
計算雜湊桶部分的長度
local function 計算雜湊桶部分的長度(
) 從陣列長度+
1 開始查詢, 同樣二分查詢 (只針對雜湊桶部分的key為正整數的資料)
end
如果有新增元素,需要考慮重新分配陣列和雜湊桶大小的因素。 重新分配的陣列大小按照50%利用率的原則。
所以,給出的建議是:
(1)盡量不要在乙個表中混用陣列或雜湊桶部分,即乙個表最好只存放一類資料。lua的實現上確實提供了兩者統一表示的遍歷,但是這並不意味著使用者就應該混用這兩種方式。
(2)盡量不要在表中存放nil值,這會讓取長度操作的行為不穩定。
(3)盡量避免重新雜湊操作,因為這個操作的代價極大,通過預分配、只使用陣列部分等策略規避這個lua直譯器背後的動作,能提公升不少效率。
lua的table長度問題
看以下 local tbltest1 print table.getn tbltest1 這段 輸出的結果是3,這個大家都知道,是吧。不管最後那個3後面有沒有加逗號,結果都是3。再看下面的 local tbltest2 print table.getn tbltest2 這段 輸出的結果是多少?這裡...
Lua中table的長度
官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 table t 的長度被定義成乙個整數下標 n 它滿足 t n 不是nil而 t n 1 為nil 此外,如果 t 1 為nil,n 就可能是零。對於常規的陣列,裡面從 1 到 n 放...
lua中求table長度
關於lua table介紹,看以前的文章 官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 tablet的長度被定義成乙個整數下標n。它滿足t n 不是nil而t n 1 為nil 此外,如果t 1 為nil,n就可能是零。對於常規的...