2017-07-06 96 views
0

我的問題:我正在從數據庫下載JFreeChart的大量數據。我想在不使用基本表的情況下優化數據內存使用情況。內存分配原始流vs原始類型表

使用集合需要使用對象。 我想知道是否可以使用像IntStream這樣的基本流優化內存使用情況,而不是例如LinkedList<Integer>

我不知道如何制定可靠的基準。

+2

先編寫好的代碼,如果需要的話,稍後優化。預優化是一個錯誤。 – lucasvw

+0

可能只有*可靠的方式來衡量一個對象的大小,但需要一段時間習慣http://openjdk.java.net/projects/code-tools/jol/ – Eugene

+0

'IntStream'是一個「輕量級目的」。從某種意義上說,任何Java流,原始的或其他的,都只能「查看」一個數據,你可以通過查看它來訪問。考慮到你以jdbc的形式使用數據庫,它的'ResultSet'也可以被看作是一種迭代器,你確實可以建立一個流,但這只是許多解決方案中的一個。您甚至可能希望構建所有圖表數據並直接在數據庫中進行修剪,而不會浪費循環執行Java中的所有處理。 –

回答

1

如果您的出發點是LinkedList<Integer>,則只需將其替換爲ArrayList<Integer>即可顯着減少內存消耗,如When to use LinkedList over ArrayList?中所述。由於盒裝整數是小對象,其中一些盒子甚至可以在裝箱時重複使用,因此this answer的圖表具有重要意義。

如果你想讓它更簡單,只需使用int[]。如果您需要增量填充的東西,Stream API的確有一個選項。使用IntStream.builder()可獲得一個IntStream.Builder,您可以重複添加新的int值。一旦它包含所有值,您可以調用build().toArray()以獲取包含所有值的int[]數組,或者您可以直接對由build()返回的IntStream執行過濾和聚合操作(如果可以將聚合操作表示爲縮減)。