为什么自定义比较器不能与hashSet一起使用来检查重复的对象

时间:2014-01-26 11:08:02

标签: java eclipse hashset

我在Mobile类中定义了Comparator进行比较。比较标准,我使用了移动的id字段。

Eclipse显示第一个错误(hashSet):(语法错误),而对于treeset,它完美地运行。

HashSet<Mobile> mobileSet = new HashSet(new Mobile().new Comparator())
    TreeSet<Mobile> ts = new TreeSet<Mobile>(new Mobile().new Comparator());

有人可以帮助我。

作为使用hashset的结果,我需要覆盖BaseClass(Mobile)中的equals和hashcode

2 个答案:

答案 0 :(得分:2)

Hashset的设计不接受重复!因此,如果您的集合不包含给定元素,则会将其添加到集合中。但是,如果你的集合中出现了这样的元素,那么第二个(相同的)元素将不被添加并将被丢弃。

<强> HashSet的:

  

类为基本操作提供恒定的时间性能(添加,   删除,包含和大小)。它不保证顺序   元素将随时间保持不变,迭代性能取决于   关于HashSet的初始容量和加载因子。这是
  接受默认负载系数是非常安全的,但您可能需要指定
  初始容量大约是您预期的两倍大小   成长的集合。

<强> TreeSet中:

  

保证基本操作的log(n)时间成本(添加,删除和   contains)保证set的元素将被排序(升序,   自然的,或通过它的构造函数指定的那个)不   为迭代性能提供任何调整参数提供了一些   处理有序集合的方便方法,如first(),last(),   headSet()和tailSet()等

要点:

  

两者都保证了元素的无重复收集   更快地将元素添加到HashSet然后转换集合   到TreeSet进行无重复的排序遍历。都不是   实现是同步的。也就是说,如果多个线程访问a   并发设置,并且至少有一个线程修改了它,它   必须在外部同步。 LinkedHashSet在某种意义上说   HashSet和TreeSet之间的中间件。实现为哈希表   通过它运行链接列表,但它提供   与有序遍历不同的insert-ordered迭代   由TreeSet保证。

答案 1 :(得分:1)

HashSet<Mobile> mobileSet = new HashSet(new Mobile().new Comparator())

让我们列举一些代码行错误的东西:

  • 它缺少结束分号(您的“语法错误”);
  • 它缺少new HashSet;
  • 上的泛型类型参数(或菱形运算符)
  • 它使用与HashSet(Collection<? extends E> coll)不兼容的构造函数参数。

HashSet的Javadoc解释了散列集的工作原理。应该很容易意识到它与Comparator s无关。