如何在HashSet,HashMap等中进行值比较

时间:2013-06-27 12:05:34

标签: java collections hashcode hashset

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

我的问题是:我在HistoryTeardownDetails的设置器中为对象htd1htd2设置了相同的字符串值,因此只允许其中一个对象进入Hashset(与String实现的情况一样)。

任何人都可以帮助我解决使用哈希码概念在Hashset或任何集合中消除重复的问题吗?

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 个答案:

答案 0 :(得分:3)

  • HashSets存储唯一元素。一个简单的规则

如果要向哈希集添加一个相等的对象,那么前一个将被新的替换。

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

您需要为自己的类提供equalshashcode,然后添加到hashset中。 然后只有它会给出所需的输出

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

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

答案 1 :(得分:2)

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

您需要覆盖equals课程中的hashCodeHistoryTeardownDetails方法。

答案 2 :(得分: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方法检查相等性。如果它存在则返回而不添加

答案 3 :(得分:0)

我认为在HashMaps中,通过在Object中使用hashCode()方法的哈希值来定义相等性。

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