一、關於Object類的equals方法的特色java
a) 自反性: x.equals(x) 應該返回trueide
b) 對稱性: x.equals(y)爲true,那麼y.equals(x) 也爲true性能
c) 傳遞性: x.equals(y)爲true,而且y.equals(z) 爲true, 那麼x.equals(z) 也爲truethis
d) 一致性 x.equals(y) 第一次調用爲true,那麼在沒有修改x和y時, 第二次,第n次調用也應該爲true。code
二、關於Object類的hashcode()方法對象
a) 在Java應用的一次執行過程當中,對同一個對象的hasCode方法的屢次調用,他們應該返回一樣的值(前提示該對象的信息沒有變化)blog
b)對應兩個對象來講,若是使用equals方法比較返回true,那麼這兩個對象的hashCode值必定是相同的。hash
c)對於兩個對象來講,若是使用equals方法比較返回false,那麼這兩個對象的hashCode值不必定是相同的。若是不一樣,能夠提升應用的性能。io
d) 對於Object類來講,不一樣的Object對象的hashCode值是不一樣的。(Object類的hashCode值表示對象的地址)class
三、當使用HashSet的add方法時,hashCode方法就會獲得調用,判斷已經存儲在集合中的全部對象的hash code值是否與增長的對象的hash code值一致;若是不一致,直接加進去;若是一致,再進行equals方法的比較,equals方法若是返回true,表示對象已經加進去了,就不會再增長新的對象,不然加進去。
1)demo1
public static void main(String[] args) { HashSet set = new HashSet(); set.add(new People("Tom")); set.add(new People("Nick")); set.add(new People("Nick")); System.out.println(set); }
返回
[com.example.collectiondemo.People@7852e922, com.example.collectiondemo.People@15db9742, com.example.collectiondemo.People@6d06d69c]
2)、demo2
public static void main(String[] args) { HashSet set = new HashSet(); People lisi = new People("Lisi"); set.add(lisi); set.add(lisi); System.out.println(set); }
返回
[com.example.collectiondemo.People@15db9742]
3)demo3
public static void main(String[] args) { HashSet set = new HashSet(); String s1 = new String("a"); String s2 = new String("a"); set.add(s1); set.add(s2); System.out.println(set); }
返回
[a]
四、若是咱們重寫equals方法,那麼也要重寫hashCode方法,反之亦然。
五、Demo: 建立一個Student對象,若是名字同樣,就不添加到Set集合中。
public class SetTest3 { public static void main(String[] args) { HashSet set = new HashSet(); Student s1 = new Student("Tom"); Student s2 = new Student("Tom"); set.add(s1); set.add(s2); System.out.println(set); } } class Student{ String name; public Student(String name) { this.name = name; } @Override public int hashCode() { return this.name.hashCode(); } @Override public boolean equals(Object obj) { if(this == obj){ return true; } if(null != obj && obj instanceof Student){ Student s = (Student)obj; if(name.equals(s.name)){ return true; } } return false; } @Override public String toString() { return "Student [name=" + name + "]"; } }
打印
[Student [name=Tom]]