我在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
答案 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无关。