2014-02-11 57 views
2

有沒有什麼辦法讓ArrayList的內部數組不被重複?Java ArrayList toArray避免複製

我有一個函數,它需要一個普通的java數組作爲輸入,我想調用一個ArrayList的內容。問題是我會非常頻繁地調用它,每次複製都會導致性能問題。

+0

你怎麼知道ArrayList有一個「內部數組」?它可能是一個鏈表或任何其他結構。 –

+2

@HotLicks:鏈表會使O(1)隨機訪問棘手... –

+2

@HotLicks真的嗎? 「ArrayList」的含義是什麼? – Henry

回答

2
​​

請注意,每次數組列表被調整大小時都需要重新執行此操作。然後再次,這是脆弱和可怕的,你永遠不應該做的一開始。


如果您需要隨機存取處理您的數據,但元素的數量可以增長,你不能把一個上限上,然後ArrayList是概念上的工作的工具。在這種情況下,你應該做的是重構你的處理代碼,以便與Lists一起工作。像ArrayList這樣的隨機存取實現爲您提供了所有的數組,所以我原則上沒有發現任何問題。

+1

脆弱和可怕,可能無法在任何其他版本的Java和...是的。 querent確實說「任何方式」,這可能是一種方式,所以這是一個正確的答案。我仍然沒有決定我是否能夠良心投票。 – keshlam

+0

在這種情況下,這是獨特的解決方案,即使他打破了「失能」。所以+1。 –

+0

請注意,這個(可怕的)方案不會返回數組的大小。 –

1

不是我所知道的。然而,沒有什麼說你不能創建你自己的實現List,它是圍繞一個暴露的Array。線程安全性和可變性 - 以及如果進一步附加到列表中會導致關聯被迫重新分配數組,這個事實將會丟失 - 這是您不得不處理的問題,但沒有理由不能做出來這行得通。

這就是接口的好處 - 如果一個實現沒有你需要的特性,你可以創建另一個。

2

寫你自己的數組列表實現公共訪問支持數組,或從fastutil使用一個不同於任何現有的Java集合lib中,例如ObjectArrayList<E>有方法E[] elements()。是的,單個類的依賴關係有點奇怪,但是如果你關注性能,你可以找到有用的集合的原始特化。