1. 程式人生 > 實用技巧 >Java 執行緒與同步的效能優化

Java 執行緒與同步的效能優化

equals要求:
1. 對稱性:如果x.equals(y)返回是"true",那麼y.equals(x)也應該返回是"true"。 2. 反射性:x.equals(x)必須返回是"true"。 3. 類推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那麼z.equals(x)也應該返回是"true"。 4. 一致性:如果x.equals(y)返回是"true",只要x和y內容一直不變,不管你重複x.equals(y)多少次,返回都是"true"。 5. 非空性:x.equals(null),永遠返回是"false";x.equals(和x不同型別的物件)永遠返回是"false"。
 1         /**
 2          * @desc 覆蓋equals方法
 3          */
 4         @Override
 5         public boolean equals(Object obj){
 6             if(obj == null){
 7                 return false;
 8             }
 9 
10             //如果是同一個物件返回true,反之返回false
11             if(this == obj){
12                 return
true; 13 } 14 15 //判斷是否型別相同 16 if(this.getClass() != obj.getClass()){ 17 return false; 18 } 19 20 Person person = (Person)obj; 21 return name.equals(person.name) && age==person.age; 22 }

1         /**
2 * @desc重寫hashCode 3 */ 4 @Override 5 public int hashCode(){ 6 int nameHash = name.toUpperCase().hashCode(); 7 return nameHash ^ age; 8 }

注:

1.hashCode() 在散列表中才有用,在其它情況下沒用,如HashMap,Hashtable,HashSet。

2.建立Person類的散列表集合,必須同時覆蓋Person類的equals() 和 hashCode()方法。

才有如下情況:

1)、如果兩個物件相等,那麼它們的hashCode()值一定相同。
這裡的相等是指,通過equals()比較兩個物件時返回true。
2)、如果兩個物件hashCode()相等,它們並不一定相等。
因為在散列表中,hashCode()相等,即兩個鍵值對的雜湊值相等。然而雜湊值相等,並不一定能得出鍵值對相等。補充說一句:“兩個不同的鍵值對,雜湊值相等”,這就是雜湊衝突。

參考文章:

https://www.cnblogs.com/skywang12345/p/3324958.html