3 回答

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
不,呼叫array.length
是O(1)
或恒定時間操作。
由于.length
is(行為)是其public
final
成員array
,因此訪問本地變量并不慢。(這與調(diào)用方法非常不同size()
)
現(xiàn)代JIT編譯器可能.length
無論如何都會優(yōu)化調(diào)用。
您可以通過查看OpenJDK中JIT編譯器的源代碼,或通過讓JVM轉(zhuǎn)儲出JIT編譯的本機(jī)代碼并檢查代碼來確認(rèn)這一點。
請注意,可能存在JIT編譯器無法執(zhí)行此操作的情況; 例如
如果您正在調(diào)試封閉方法,或者
如果循環(huán)體有足夠的局部變量來強制寄存器溢出。

TA貢獻(xiàn)1817條經(jīng)驗 獲得超6個贊
午飯時我有點時間:
public static void main(String[] args) {
final int[] a = new int[250000000];
long t;
for (int j = 0; j < 10; j++) {
t = System.currentTimeMillis();
for (int i = 0, n = a.length; i < n; i++) { int x = a[i]; }
System.out.println("n = a.length: " + (System.currentTimeMillis() - t));
t = System.currentTimeMillis();
for (int i = 0; i < a.length; i++) { int x = a[i]; }
System.out.println("i < a.length: " + (System.currentTimeMillis() - t));
}
}
結(jié)果:
n = a.length: 672
i < a.length: 516
n = a.length: 640
i < a.length: 516
n = a.length: 656
i < a.length: 516
n = a.length: 656
i < a.length: 516
n = a.length: 640
i < a.length: 532
n = a.length: 640
i < a.length: 531
n = a.length: 641
i < a.length: 516
n = a.length: 656
i < a.length: 531
n = a.length: 656
i < a.length: 516
n = a.length: 656
i < a.length: 516
筆記:
如果你反轉(zhuǎn)測試,那么n = a.length顯示比i < a.length大約一半快,可能是由于垃圾收集(?)。
250000000因為我得到了OutOfMemoryError,所以我不能做得更大270000000。
重點是,并且它是其他人一直在制作的,你必須運行Java內(nèi)存,你仍然沒有看到兩個替代品之間的速度有顯著差異。把你的開發(fā)時間花在真正重要的事情上。

TA貢獻(xiàn)1804條經(jīng)驗 獲得超8個贊
我懷疑是否有任何重大差異,即使有,我敢打賭它可能在編譯期間被優(yōu)化掉了。當(dāng)你嘗試微觀優(yōu)化這樣的事情時,你會浪費你的時間。首先使代碼可讀和正確,然后如果遇到性能問題,請使用分析器,然后擔(dān)心選擇更好的數(shù)據(jù)結(jié)構(gòu)/算法,然后擔(dān)心優(yōu)化探查器突出顯示的部分。
添加回答
舉報