如何在内部避免重复?

时间:2013-02-25 07:51:31

标签: java

我对Collections框架中的set有疑问。集合本身将如何识别重复项以及它将如何识别?谁能解释一下它是如何实现的?哈希码和等于方法将如何进入图片?我需要一个简短的解释,因为它对我来说非常重要。

6 个答案:

答案 0 :(得分:6)

它大致像这样工作

if (!collection.contains(element))
    collection.add(element);

并且contains方法将使用equals / hashcode。

在TreeSet中,元素存储在红黑树中,而HashSet则使用HashMap。

事实上,它添加到容器的方式特定于元素(树上的点,哈希表中的桶),因此添加本身使用equals / hashcode。

答案 1 :(得分:5)

javadoc for Set.

中对此进行了解释
  

不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。

答案 2 :(得分:3)

HashSet使用hashcode()来解析对象应该去的存储区,使用equals()方法来检查位于该存储桶上的对象的相等性

答案 3 :(得分:3)

实际实现取决于容器。 HashMap根据hashCode查找项目,然后使用equals测试插入的对象和存储的对象(这是要求a.equals(b) iff {{的原因之一1}})。

另一方面,

b.equals(a)依赖于TreeMap方法的结果(如果元素实现ComparablecompareTo方法实现{{3} }})。如果compare返回0,则元素被视为“等于”。 (请注意,compare与等于一致,即compareTo iff a.compareTo(b)==0)。

答案 4 :(得分:0)

“请你解释一下这些例子.ss.add(”123“); s.add(”123“);”

对于上面用Set界面解释的查询,请参考下面的摘录和说明。

public void setTest() {
    Set<String> obj = new HashSet<>();
    System.out.println(obj.add("123")); //Output : true
    System.out.println(obj.add("123")); //Output : false
}

如果您在上面的代码段中注意到,我们已经添加了两次123。第一次添加SOP将返回true。然后第二次添加“123”,SOP将返回false。

有了这个,我们可以理解, 如果我们第二次在Set中添加相同的值,那么将跳过重复的值

答案 5 :(得分:0)

基本设置是一个具有许多不同实现的接口,现在让我们以HashSet实现为回答您的问题,我下载了源代码并进入了HashSet类,然后我搜索了add方法,发现它使用HashMap来存储唯一值。它使用要存储的值作为HashMap的键,并将键的对应值(即下面的代码片段中的PRESENT)用作常量值(此值是虚拟值),我们都知道map的键是唯一的。这就是它的工作方式。 下面的代码:

private static final Object PRESENT = new Object();
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}