我们来看看 Set的一个实现HashSet中的add方法,HashSet内部使用一个HashMap来存放对象, 
HashSet把要保存的对象做为其内部HashMap的key,如下: 

Java代码 
  1. //PRESENT为一个辅助的Object型对象  
  2. public boolean add(E o) {  
  3.     return map.put(o, PRESENT)==null;  
  4.     }  

如果有两个对象A,B, A.equals(B)返回ture,则 
A和B只会有一个被保存在set中。 
在HashMap中判断两个key相同的逻辑是 hashcode()相等并且 equals()返回true。 

再看看HashMap中的put()

Java代码 
  1. public V put(K key, V value) {  
  2.     if (key == null)  
  3.         return putForNullKey(value);  
  4.         int hash = hash(key.hashCode());  
  5.         int i = indexFor(hash, table.length);  
  6.         for (Entry e = table[i]; e != null; e = e.next) {  
  7.             Object k;  
  8.             /** 
  9.             * 因为A.equals(B)为true,故A.hashCode() == B.hashCode(); 
  10.             * 故会进入到下面的if块内部,从而保证了A和B只有一个被保存在Set里 
  11.             */      
  12.         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  13.                 V oldValue = e.value;  
  14.                 e.value = value;  
  15.                 e.recordAccess(this);  
  16.                 return oldValue;  
  17.             }  
  18.         }  
  19.   
  20.         modCount++;  
  21.         addEntry(hash, key, value, i);  
  22.         return null;  
  23.     }  

 

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 中,只有hashcode相等时 

才会调用后面的key.equals(k) 

readable angular tests

In this post, I'll provdes some tips to create readable angular test.### General Tips#### Use describe or nested describe to structure sp...… Continue reading

Exposing event stream from monolith

Published on September 18, 2017