0

下面是我试过的一段代码;也给出了输出。

我的问题是:我在 setter 中HistoryTeardownDetails为两个对象htd1和设置了相同的 String 值htd2,因此在 Hashset 中应该只允许其中一个对象(如 String 实现的情况)。

谁能帮助我了解如何使用哈希码的概念消除哈希集或任何集合中的重复项?

public class HashSetTry {
public static void main(String[]args){
HistoryTeardownDetails htd1=new HistoryTeardownDetails();
htd1.setProcess("ashwin");
HistoryTeardownDetails htd2=new HistoryTeardownDetails();
htd2.setProcess("ashwin");

HashSet<HistoryTeardownDetails> hashSet1=new HashSet<HistoryTeardownDetails>();
System.out.println("First --> "+hashSet1);

hashSet1.add(htd1);


System.out.println("Second --> "+hashSet1);

hashSet1.add(htd2);

System.out.println("Third --> "+hashSet1);

HashSet<String> hashSet2=new HashSet<String>();

System.out.println("First --> "+hashSet2);

hashSet2.add("abc");


System.out.println("Second --> "+hashSet2);

hashSet2.add("abc");

System.out.println("Third --> "+hashSet2);

HashSet<String> hashSet3=new HashSet<String>();

String abc=new String("sakthi");

System.out.println("First --> "+hashSet3);

hashSet3.add(abc);

String abcd=new String("sakthi");

System.out.println("Second --> "+hashSet3);

hashSet3.add(abcd);

System.out.println("Third --> "+hashSet3);

}
}

输出:

First --> []
Second --> [com.ford.wqr.object.HistoryTeardownDetails@20662066]
Third --> [com.ford.wqr.object.HistoryTeardownDetails@20662066,    com.ford.wqr.object.HistoryTeardownDetails@20862086]

First --> []
Second --> [abc]
Third --> [abc]

First --> []
Second --> [sakthi]
Third --> [sakthi]
4

4 回答 4

3
  • HashSet 存储独特的元素。一个简单的规则

如果您将相等的对象添加到哈希集中,则前一个对象将被新对象替换。

对于最后两种情况,您使用的是字符串,已经提供了equals和方法的实现。hashcode

您需要为自己的类提供equals和,然后添加到哈希集中。hashcode然后只有它会给出所需的输出

  • 如果这两个对象被认为是equal,那么它们的哈希码必须相等

我建议您为自己的类使用 eclipse 生成equals和方法。hashcode

于 2013-06-27T12:13:32.750 回答
2

重复项由equals对象的方法确定。

您需要覆盖类中的equalsandhashCode方法HistoryTeardownDetails

于 2013-06-27T12:07:14.957 回答
1

HashSet.add 实际上使用了内部 HashMap 的 put 方法。那么让我们看看 HashMap.put 的源代码

386     public V put(K key, V value) {
387         if (key == null)
388             return putForNullKey(value);
389         int hash = hash(key.hashCode());
390         int i = indexFor(hash, table.length);
391         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
392             Object k;
393             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
394                 V oldValue = e.value;
395                 e.value = value;
396                 e.recordAccess(this);
397                 return oldValue;
398             }
399         }
400 
401         modCount++;
402         addEntry(hash, key, value, i);
403         return null;
404     }

在第 393 行看到,如果新键的哈希值等于任何成员的哈希值,那么它会检查键是否是相同的引用,并使用 equals 方法检查相等性。如果存在,则返回而不添加

于 2013-06-27T12:12:41.800 回答
0

我认为在 HashMaps 中,相等性是通过在 Object.hashCode() 方法中具有相同的哈希值来定义的。

如果您提供 equals 实现,则建议始终提供 hashCode 实现,以获得正确的 java.util.collection 行为。

于 2013-06-27T12:12:21.617 回答