2 回答

TA貢獻1735條經(jīng)驗 獲得超5個贊
從 C# 的角度回答。
對于空ArrayList
的,如果您有一個空數(shù)組作為后備存儲,您會發(fā)現(xiàn)所有邏輯(獲取、添加、增長......)都“按原樣”工作。不需要額外的代碼來處理未初始化的情況,這使得整個實現(xiàn)更加整潔。而且由于空數(shù)組被緩存,這不會導(dǎo)致額外的堆分配,因此您無需額外成本即可獲得更簡潔的代碼。
因為HashSet
這是不可能的,因為訪問存儲桶是通過公式完成的hashCode % m_buckets.Length
。嘗試計算% 0
被視為除以 0,因此無效。這意味著您需要專門處理“未初始化”的情況,因此您不會從使用空數(shù)組預(yù)先分配字段中獲得任何收益。

TA貢獻1817條經(jīng)驗 獲得超6個贊
初始化elementData
為一個空數(shù)組ArrayList
可以避免null
檢查grow(int minCapacity)
方法,該方法調(diào)用:
elementData = Arrays.copyOf(elementData, newCapacity);
增加后備陣列的容量。當(dāng)?shù)谝淮握{(diào)用該方法時,該語句會將空數(shù)組“復(fù)制”到新數(shù)組的開頭(實際上它不會復(fù)制任何內(nèi)容)。
在HashMap
類似的策略中不會有用,因為當(dāng)您重新調(diào)整存儲桶數(shù)組的大小時,您不會將原始數(shù)組復(fù)制到新數(shù)組的開頭,您必須遍歷所有條目并找到新存儲桶每個條目的。因此,將 buckets 數(shù)組初始化為空數(shù)組而不是將其保持為 null 將需要您檢查數(shù)組的長度是否 == 0 而不是檢查它是否為 null。用另一種條件替換一個條件是沒有用的。
添加回答
舉報