2 回答

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
從 C# 的角度回答。
對(duì)于空的 ,您會(huì)發(fā)現(xiàn),如果您有一個(gè)空數(shù)組作為后備存儲(chǔ),則所有邏輯(get,add,grow,...)都“按原樣”工作。無(wú)需額外的代碼來(lái)處理未初始化的情況,這使得整個(gè)實(shí)現(xiàn)更加整潔。由于空數(shù)組是緩存的,這不會(huì)導(dǎo)致額外的堆分配,因此您可以獲得更干凈的代碼,而無(wú)需額外費(fèi)用。ArrayList
因?yàn)檫@是不可能的,因?yàn)樵L問(wèn)存儲(chǔ)桶是通過(guò)公式完成的。嘗試計(jì)算被視為除以 0,因此無(wú)效。這意味著您需要專門處理“未初始化”的情況,因此使用空數(shù)組預(yù)先分配字段不會(huì)獲得任何好處。HashSet
hashCode % m_buckets.Length
% 0

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
初始化為 中的空數(shù)組可以避免在方法中簽入,該方法調(diào)用:elementData
ArrayList
null
grow(int minCapacity)
elementData = Arrays.copyOf(elementData, newCapacity);
以增加后備陣列的容量。首次調(diào)用該方法時(shí),該語(yǔ)句會(huì)將空數(shù)組“復(fù)制”到新數(shù)組的開(kāi)頭(實(shí)際上它不會(huì)復(fù)制任何內(nèi)容)。
在類似的策略中,沒(méi)有用,因?yàn)楫?dāng)您重新調(diào)整存儲(chǔ)桶數(shù)組的大小時(shí),您不會(huì)將原始數(shù)組復(fù)制到新數(shù)組的開(kāi)頭,您必須遍歷所有條目并找到每個(gè)條目的新存儲(chǔ)桶。因此,將 bucket 數(shù)組初始化為空數(shù)組而不是將其保留為 null 將要求您檢查數(shù)組的長(zhǎng)度是否 == 0,而不是檢查它是否為 null。用另一個(gè)條件替換一個(gè)條件是沒(méi)有用的。HashMap
添加回答
舉報(bào)