2010-01-12 78 views
10

考慮下面的代碼:Java是「緩存」匿名類嗎?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • 將如何處理的Java類的currentList
  • 對於200個物體中的每一個,它會認爲它是不同的類嗎?
  • 即使在第一個對象被創建後它會是性能問題嗎?
  • 它以某種方式緩存它嗎?

我只是好奇:)

+3

Afaik匿名類是一個簡單的類,只有一個生成的名稱。而已。緩存與類加載器中的每個類一樣執行。 – ZeissS 2010-01-12 17:10:06

+0

實際上這會產生一個編譯器錯誤:'我'不是最終的,這對於循環計數器來說是個壞主意。但一個很好的問題! – 2010-01-12 19:10:43

回答

15
ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 

通過你的循環創建匿名類的每一次新的實例,它不是重新定義或每次重裝類。該類被定義一次(在編譯時),並被加載一次(在運行時)。

使用匿名類沒有顯着的性能影響。

+2

...並且引用「currentList」在for循環後將無法訪問並再次創建。在這個意義上,它引用的對象(內部類實例)將被立即標記爲垃圾收集。 – OscarRyz 2010-01-12 17:25:26

15

編譯器將把任何匿名類轉換爲命名的內部類。所以你的代碼將被轉換成以下幾行:

class OuterClass$1 extends ArrayList<Integer> { 
    OuterClass$1(int i) { 
     super(); 
     add(i); 
    } 
} 

for (int i = 0; i < 200; i++) { 
    ArrayList<Integer> currentList = new OuterClass$1(i); 
}