2014-06-24 25 views
2

我想知道.size()方法的性能。此方法是否從列表中的對象數量返回引用(如每次將對象添加到列表時都增加的類成員)?還是它遍歷所有對象?Java List size()性能和提示

哪一個更有效?

調用.size()每次:

List<Vector3> objects = getCoords(); 

for (int x = 0; x < objects.size(); x++){ 
    for (int y = 0; y < objects.size(); y++){ 
     for (int z = 0; z < objects.size(); z++){ 
     drawShape(x, y, z); 
     } 
    } 
} 

或者通過保存到一個局部變量:

List<Vector3> objects = getCoords(); 
int size = objects.size(); 

for (int x = 0; x < size; x++){ 
    for (int y = 0; y < size; y++){ 
     for (int z = 0; z < size; z++){ 
     drawShape(x, y, z); 
     } 
    } 
} 

讓我們假設,我們已經在列表中> 30.000對象。

哪一個更快/更高效?

如果我們使用ArrayList<T>List<T>是否重要?

什麼簡單的語句:.size().isEmpty()

if (objects != null && objects.size() > 0){ 
    doThis(); 
} 

或致電.isEmpty()

if (objects != null && !objects.isEmpty()){ 
    doSomethingElse(); 
} 
+0

班級成員,如果有內存服務。你可以通過各種實現的源代碼來找出問題,但我真的懷疑迭代方法會被採用。性能損失太大,以致無法保證4字節內存的節省。如果尺寸不變,你的兩個循環*可以是等價的,並且我認爲在這種情況下JITC可以將一個變成另一個。無論您使用'ArrayList '還是'List '都是一個靈活性問題。最後,你選擇實際的實現。 'size()'和'isEmpty()'解決了不同的問題。 – awksp

+0

'getCoords()'返回什麼類型的'List'?它可能並不重要,但值得注意的是'List'只是一個接口,所以它的實現可能會有不同的表現。 –

+0

無需「挖掘」。查看源代碼。至於ArrayList vs List:一個是接口。保留作業左側的接口有其優點(更多關於SO的某處) – keyser

回答

2

的Java List使用實例變量來處理的大小。增加時遞增,減少時遞減。調用list.size()返回一個變量,因此是O(1)。

List.size()會(理論上)看起來像:

public int size() { 
    return this.size; 
} 

調用List.isEmpty()是對實例變量size是否等於0或不是布爾檢查。

public boolean isEmpty() { 
    return (this.size==0); 
} 

由於這是一個實例變量,它不(據我所知)你使用什麼類型的List,重要,因爲所有繼承的通用接口,並擁有所需的add()等功能。

+0

這取決於List接口的實現。 –

+0

我認爲所有的標準'List's存儲的大小,但它是可以想象的用戶製造一個不會。 –

+0

說_instance_變量而不是_class_變量不那麼含糊。第二個常常引用靜態成員變量。 – keyser