2013-04-24 116 views
1

因此,我們有一個HashMap和一個瞬態Entry []表格。在許多方法,例如,在明確的(),我們複製表:關於Java HashMap源碼

public void clear() { 
    modCount++; 
    Entry[] tab = table; 
    for (int i = 0; i < tab.length; i++) 
     tab[i] = null; 
    size = 0; 
} 

但爲什麼我們做入口[]選項卡=表?下一個代碼有什麼問題?

public void clear() { 
    modCount++; 
    for (int i = 0; i < table.length; i++) 
     table[i] = null; 
    size = 0; 
} 

據我所知,標籤只是表格的參考,乍一看,只是空間的浪費。

+1

浪費了什麼空間?方法局部變量很便宜,只要方法完成就立即消失。這是一種技術示例 - 在現代JVM中不太必要,但在最初編寫「HashMap」時是必需的,以緩存局部變量中的對象字段以提高速度。 – 2013-04-24 22:33:52

+0

你不**複製**表格。這不是C++,沒有拷貝構造函數或任何涉及的東西。您只在參考和參考上進行操作。這項任務的成本幾乎沒有。 – 2013-04-24 22:40:40

+0

Louis Wasserman,請你解釋一下,如何緩存局部變量中的對象字段可以加速? Daniel Kamil Kozar,是的,我知道這一點。 – user2317480 2013-04-24 22:46:21

回答

0

它只是一個本地作用域對象引用。那裏沒有太多的空間。

+0

固定標籤=>表 – user2317480 2013-04-24 22:19:55

1
for (int i = 0; i < table.length; i++) 
     tab[i] = null; 

你是對的,tabtable都指向同一個對象。我看到的問題是for-conditional和for-body中的tab使用表。你應該使用其中一種,但不能同時使用。

tab是不必要的,但有時候人們爲了可讀性的原因這樣做。這裏沒有意義,因爲表格更具可讀性。如果我是代碼審查這個,我會強烈傾向於第二個版本。

+0

我認爲這只是一個錯字,他在第二個例子中肯定意味着它是'table [i] = null;'。 – ddmps 2013-04-24 22:10:46

+0

是的,忘了它。固定標籤[i] = null; => table [i] = null; – user2317480 2013-04-24 22:22:32