在Set或者Map存數據的時候:咱們先經過 hashcode來判斷兩個對象是否在一個鏈表上,但這個鏈表上可能有不少元素之,那麼咱們就須要再經過 equals 來判斷時候存在相同的值,以便進行對該數據進行存儲或者覆蓋。【因此當咱們重寫equal()方法,就必須先重寫hashCode()方法】this
實例:.net
- public class HashTest {
- private int i;
-
- public int getI() {
- return i;
- }
-
- public void setI(int i) {
- this.i = i;
- }
-
- public int hashCode() {
- return i % 10;
- }
-
- public final static void main(String[] args) {
- HashTest a = new HashTest();
- HashTest b = new HashTest();
- a.setI(1);
- b.setI(1);
- Set<HashTest> set = new HashSet<HashTest>();
- set.add(a);
- set.add(b);
- System.out.println(a.hashCode() == b.hashCode());
- System.out.println(a.equals(b));
- System.out.println(set);
- }
- }
這個輸出的結果:code
- true
- false
- [com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]
以上這個示例,咱們只是重寫了hashCode方法,從上面的結果能夠看出,雖然兩個對象的hashCode相等,可是實際上兩個對象並非相等;,咱們沒有重寫equals方法,那麼就會調用object默認的equals方法,【是比較兩個對象的引用是否是相同,顯示這是兩個不一樣的對象,兩個對象的引用確定是不定的】。這裏咱們將生成的對象放到了HashSet中,而HashSet中只可以存放惟一的對象,也就是相同的(適用於equals方法)的對象只會存放一個,可是這裏其實是兩個對象a,b都被放到了HashSet中,這樣HashSet就失去了他自己的意義了。對象
此時咱們把equals方法給加上:get
- public class HashTest {
- private int i;
-
- public int getI() {
- return i;
- }
-
- public void setI(int i) {
- this.i = i;
- }
-
- public boolean equals(Object object) {
- if (object == null) {
- return false;
- }
- if (object == this) {
- return true;
- }
- if (!(object instanceof HashTest)) {
- return false;
- }
- HashTest other = (HashTest) object;
- if (other.getI() == this.getI()) {
- return true;
- }
- return false;
- }
-
- public int hashCode() {
- return i % 10;
- }
-
- public final static void main(String[] args) {
- HashTest a = new HashTest();
- HashTest b = new HashTest();
- a.setI(1);
- b.setI(1);
- Set<HashTest> set = new HashSet<HashTest>();
- set.add(a);
- set.add(b);
- System.out.println(a.hashCode() == b.hashCode());
- System.out.println(a.equals(b));
- System.out.println(set);
- }
- }
此時獲得的結果就會以下:hash
- true
- true
- [com.ubs.sae.test.HashTest@1]