2013-01-14 71 views
1

考慮以下兩個調用java中相同的方法,包括: -我們應該傳遞參數的方法作爲變量或作爲新對象直接在Java

1)doSomething(new Object[]{"something"}) ;

2)

Object[] obj = {"something"} ; 

doSomething(obj); 

哪一個在內存和時間效率方面更高效?我會說1)在內存和時間效率方面都更好。原因在於第二個選項需要我們創建另一個變量(額外內存),然後將該值賦予變量(額外時間)。任何意見 ?

只是爲了澄清對象將只創建一次,我說的額外變量被用來保存新創建的對象的地址。

+1

不要在這裏挑剔,但是無論你創建了什麼'obj',這是一個什麼時候/如果obj'會被垃圾收集的問題。 – posdef

回答

4

兩者在時間和記憶方面都相同。編譯器可以對額外的任務進行優化。

不同之處在於,第二個版本爲您提供了一個給變量提供有用名稱的機會,這可以使代碼更加清晰。

+0

我同意你的觀點,第二點可能很清楚。但是,讓我們說對象的實際地址是42.在第一種情況下,它將首先將該值賦予變量obj(額外時間),然後將該值傳遞給該函數。在第二種情況下,由「新」操作符返回的對象的地址將直接傳遞給該函數。所以它會像兩種情況一樣: - –

+0

1)doSomething(42); 2)obj = 42; doSomething(obj); 僅當Java要創建一箇中間變量來保存地址並傳遞該變量時,您的觀點纔有效。我不確定Java是否會這樣做。如果是的話,爲什麼需要這樣做。只需傳遞實際地址? –

2

第二次調用允許您在調用方法中重用該對象,但第一次調用不會。

它在內存中沒有發生,因爲傳遞的對象是無論如何創建的。

+0

但是也創建了另一個變量。 –

+0

不,在第二次調用中創建一個變量,然後將其作爲對被調用方法的引用傳遞。但它仍然是相同的對象,它只在內存中創建一次。好的,它創建了另一個地址引用,但它在時間和內存上都可以忽略不計,並且可以在編譯時優化,正如Mark所說的那樣。 –

+0

是的,我在談論額外的地址參考保存到新的變量(實際的對象將只創建一次)和是的,這可以忽略不計。 –

1

你應該總是考慮什麼是更簡單和更清晰的第一。當你知道你有問題時,你應該只考慮性能,因爲你是在一個分析器或微基準測試中測量它的。

最好的辦法可能是使用可變參數

doSomething("something"); 

void doSomething(String... args) { } 

注:不光是這個最簡單,但也是潛在的最快的JIT可以消除創建String[]

相關問題