[英]Queries regarding the implementation details of java.util.Hashtable
關於如何實現java.util.Hashtable,我有以下查詢。 這些是低級查詢,與Hashtable的使用無關,只與設計人員如何選擇實現數據結構有關
Hashtable
javadocs : 初始容量控制了浪費空間和重新運算操作的需要之間的權衡,這是非常耗時的。 如果初始容量大於Hashtable將包含的最大條目數除以其加載因子,則不會發生重復操作。 但是,將初始容量設置得太高會浪費空間。
該值使用0x7FFFFFFF
進行位掩碼,以刪除將使值為負的第一個位。 這會強制該值為非負值,因此%
操作后的結果索引也將為非負值。 這對於在內部桶陣列中產生可行索引是必要的。
這可能是為了略微提高性能。 本文聲稱向后循環確實如此。
結果表明,在100萬個數據中,正向和反向循環之間沒有太大差異。 然而,當數據變得龐大時,反向循環的性能比前向循環的性能略快15%左右。
我不知道這是否真的如此,但這可能是動機。
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
我不知道現在有多有效,但這是為了避免意外的OutOfMemoryError
。
#1:AndreyS在評論中回答: 為什么Hashtable的initialCapacity為11而HashMap中的DEFAULT_INITIAL_CAPACITY為16且需要2的冪
#2:在計算模數之前確保數字為正數。 否則結果可能是負面的,我們將超出界限。
#3:我必須猜測,當反向循環時,你只評估一次長度,並與常量(0)進行比較,並在常規循環中與變量進行比較。 我不知道這是否是他們心中的想法,但這可能是一個考慮因素。
#4:為避免rehash()中的整數溢出:
int i = table.length;
Entry[] arrayOfEntry1 = table;
int j = (i << 1) + 1;
if (j - 2147483639 > 0)
{
if (i == 2147483639) {
return;
}
j = 2147483639;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.