Use the add method of HashSet to overwrite hashcode and equals, and use hashsethashcode
This article describes how to use the add method of HashSet to overwrite the hashCode and equals methods. Correct the error.
1. Understand the add method of HashSet
A good way to understand a method is to look at the source code, so first look at the source code
private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();public boolean add(E e) {return map.put(e, PRESENT)==null;}
We can see from the above that HashMap is used for processing in the HashSet, And the add method actually uses the put Method of map.
1 transient Entry<K,V>[] table; 2 transient int modCount; 3 public V put(K key, V value) { 4 if (key == null) 5 return putForNullKey(value); 6 int hash = hash(key); 7 int i = indexFor(hash, table.length); 8 for (Entry<K,V> e = table[i]; e != null; e = e.next) { 9 Object k;10 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {11 V oldValue = e.value;12 e.value = value;13 e.recordAccess(this);14 return oldValue;15 }16 }17 modCount++;18 addEntry(hash, key, value, i);19 return null;20 }
Table is the data that already exists. Here, the key of the existing content is compared with the current key, e. hash = hash & (k = e. key) = key | key. equals (k), where hash is calculated based on hashcode. Generally, the hashCode is consistent, and the hash is the same. If the value is true, change the existing value to a new one. In fact, the original value of hashset is not changed, but the value of the internal hashmap is re-stored with new Object ().
2. Example
Here I should know how to rewrite it. Here is a simple example.
Public class UnlockGood {public UnlockGood () {} public UnlockGood (String skuNo, int wmsId, int count) {super (); this. skuNo = skuNo; this. count = count; this. wmsId = wmsId;} // product code private String skuNo; // quantity private int count; // repository ID private int wmsId; public String getSkuNo () {return skuNo ;} public void setSkuNo (String skuNo) {this. skuNo = skuNo;} public int getCount () {return count;} public void setCount (int count) {this. count = count;} public int getWmsId () {return wmsId;} public void setWmsId (int wmsId) {this. wmsId = wmsId ;}@ Override public boolean equals (Object obj) {UnlockGood good = (UnlockGood) obj; if (this = obj) {return true;} else if (this. getSkuNo (). equals (good. getSkuNo () & this. getWmsId () = good. getWmsId () {good. setCount (good. getCount () + this. getCount (); return true;} else {return false; }}@ Override public int hashCode () {// write a hashCode return 1 ;}}
The hashCode and equals methods are overwritten. The main method is used below.
Set<UnlockGood> unlockgoods = new HashSet<UnlockGood>(); UnlockGood good = new UnlockGood("a",1,2); unlockgoods.add(good); UnlockGood good1 = new UnlockGood("a",1,12); unlockgoods.add(good1); UnlockGood good2 = new UnlockGood("b",1,2); unlockgoods.add(good2);
In this example, the equals method is called when the hash value is consistent. Of course, if the hash value is the same key, the equals method is not called. Use this feature to modify the original value to add the desired element to the rule.