下面是我试过的一段代码;输出也是给出的。
我的问题是:我在HistoryTeardownDetails
的设置器中为对象htd1
和htd2
设置了相同的字符串值,因此只允许其中一个对象进入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]
答案 0 :(得分:3)
如果要向哈希集添加一个相等的对象,那么前一个将被新的替换。
对于最后两种情况,您使用的是字符串,已经为其提供了equals
和hashcode
方法的实现。
您需要为自己的类提供equals
和hashcode
,然后添加到hashset中。
然后只有它会给出所需的输出
equal
,那么它们的哈希码必须相等我建议您为自己的类使用eclipse生成的equals
和hashcode
方法。
答案 1 :(得分:2)
重复项由对象的equals
方法决定。
您需要覆盖equals
课程中的hashCode
和HistoryTeardownDetails
方法。
答案 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行为。