如果您只需要知道某个特定是否MyParameter
已被处理,请放弃HashSet
并使用 aBitSet
代替。
基本上,如果您只需要知道某个特定是否MyParameter
已完成,那么将整个存储MyParameter
在集合中是多余的 - 您只需要存储一个位,其中0
表示“未完成”并1
表示“完成”。这正是 aBitSet
的设计目的。
您的值的哈希MyParameter
值可能是唯一的,否则您当前使用 a 的HashSet
方法毫无意义。如果是这样,那么您可以使用hashCode()
每个MyParameter
作为位集的索引,使用相应的位作为给定MyParameter
是否完成的指示符。
这可能没有多大意义,所以下面是一个基本的实现。(请随意用您实际用于生成s 的任何内容替换for
循环、numParameters
、等)getParameter()
MyParameter
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
对象,因为它们包含处理的结果,那么您可以通过仅存储结果部分来节省空间MyParameter
(HashSet
如果可能的话 -你的问题没有说清楚)。
另一方面,如果在处理完它们后你真的需要它们MyParameter
的全部,那么你已经在尽你所能做到最好了。您可以通过将它们存储为一个向量(即可扩展数组)MyParameters
(这避免了使用 a 固有的一些内存开销HashSet
)来在内存方面做得更好,但这会因需要时间而导致速度损失扩展向量和 O(n) 搜索时间。