1、區別java
==比較的是對象的地址,在不重寫equals()和hashcode()的狀況下,equals()和hashcode()比較的也是地址。可是在重寫equals()和hashcode()後,equals()和hashcode()就能夠比較內容:code
public static void main(String[] args) { User user1 = new User(1, "A", 22); User user2 = new User(1, "A", 22); System.out.println("==:" + (user1 == user2)); System.out.println("equals():" + user1.equals(user2)); System.out.println("user1的hashcode:" + user1.hashCode()); System.out.println("user2的hashcode:" + user2.hashCode()); }
運行結果:對象
==:false equals():true user1的hashcode:509445 user2的hashcode:509445
2、注意的點同步
一、若是須要自定義equals()方法,則重寫equals(),爲遵照契約,需同步重寫hashcode();hash
二、對於String的幾個類型,equals()和hashcode()已經重寫因此能夠用equals()對內容做對比class
3、提出的問題方法
一、equals()爲true是否保證hashcode()必定一致?static
對於按照契約重寫equals()和hashcode()的狀況下,equals()爲true能保證hashcode()一致co
二、hashcode()一致是否保證equals()爲true?new
不能,會出現哈希碰撞的狀況