如果您只需要知道是否已經處理了某個特定的MyParameter
,請將其替換爲HashSet
並使用BitSet
。
基本上,如果你需要知道的是一個特定的MyParameter
是否完成與否,則存儲在集合整個MyParameter
是矯枉過正 - 你只需要存儲一個比特,其中0
指「未完成」和1
表示「完成」。這正是BitSet
的設計目的。
您的MyParameter
值的哈希大概是獨一無二的,否則您目前使用HashSet
的方法是毫無意義的。如果是這樣,則可以使用每個MyParameter
的hashCode()
作爲位集合的索引,使用相應位作爲給定的MyParameter
是否完成的指示符。
這可能沒有太大意義,所以下面是一個基本的實現。 (隨意替代for
循環,numParameters
,getParameter()
等有什麼,那就是你實際使用來產生MyParameter
S)
BitSet doneSet = new BitSet();
for (int i = 0; < numParameters; ++i) {
MyParameter parameter = getParameter(i);
if (!doneSet.get(parameter.hashCode())) {
doTask(parameter);
doneSet.set(parameter.hashCode());
}
}
這種方法的內存使用量是BitSet
怎麼有點偶然在內部實現,但我希望它比將所有MyParameters
存儲在HashSet
中顯着更好。
如果,事實上,你需要掛到您的MyParameter
對象,一旦你處理它們,因爲它們含有處理的結果,那麼你可以通過可能存儲在HashSet
的MyParameter
而造成的部分節省空間(如果這樣的事情是可能的 - 你的問題沒有說清楚)。
另一方面,如果您確實需要完整處理每個MyParameter
,那麼您已經完成了幾乎所有可以完成的工作。您可以通過將它們存儲爲MyParameters
(避免使用HashSet
固有的一些內存開銷)的向量(即可擴展陣列)來做一些更好的內存記憶方式,但這會因時間而導致速度損失需要擴展矢量和一個O(n)的搜索時間。
來源
2013-05-01 05:08:55
Mac
你的任務是否並行運行?難道你不能創建 - 執行 - 銷燬? – fotanus 2013-04-30 23:04:53
爲什麼需要在任務後存儲MyParameter對象?他們是否包含任何結果?如果你現在最關心的是使用更少的內存,你不能只是序列化MyParameter對象並將它們寫在磁盤或數據庫中嗎? – GameDroids 2013-04-30 23:13:31