编辑#2:
好吧,我搞砸了自己的第一条规则 – 永远不要过早优化.最坏的情况可能是使用范围广泛的股票HashMap – 所以我就是这么做的.它仍然在一秒钟内运行,所以忘记这里的其他一切,就这样做.
在担心棘手的实现之前,我会另外注意自己总是测试速度.
(以下是较旧的过时帖子,如果有人有超过一百万的点数,那么它仍然有效)
HashSet可以工作,但是如果你的整数有一个合理的范围(比如1-1000),那么创建一个1000个整数的数组会更有效,并且对于你的每一百万个整数,增加数组的那个元素. (与HashMap几乎相同的想法,但是优化Hash必须允许的一些未知数应该使它快几倍).
您还可以创建一棵树.树中的每个节点都包含(value,count),树将按值组织(左侧较低值,右侧较高).遍历到您的节点,如果它不存在 – 插入它 – 如果它存在,那么只需增加计数.
值的范围和分布将决定这两个(或常规哈希)中的哪一个会表现得更好.我认为常规哈希不会有很多“获胜”的情况(它必须是一个宽范围和“分组”的数据,即使这样,树也可能获胜.
由于这非常简单 – 我建议您针对实际数据集实施多个解决方案和测试速度.
编辑:RE评论
TreeMap可以工作,但仍会添加一层间接(实现自己非常容易和有趣).如果使用stock实现,则必须使用Integers并在每次增加时不断地转换为int.指向Integer的指针是间接的,并且您存储的对象数量至少为2x.这甚至不计算方法调用的任何开销,因为它们应该内联运气.
通常这将是一个优化(邪恶),但是当你开始接近数十万个节点时,你偶尔必须确保效率,因此内置的TreeMap由于内置HashSet的相同原因而效率低下将.