java 中的 hashcode() 和 equals()

在這篇文章中,咱們一塊兒來了解一下,java 中的 hashcode() 和 equals() 方法。這兩方法能夠在 Object.class中找到。依靠這兩個方法 object 能夠在 HashMap,Hashtable 以及 HashSet 儲存和索引。html

  • hashcode();
  • equals();

使用 hashcode()和equals();

hashcode():

hashCode()方法被用來獲取給定對象的惟一整數。這個整數被用來肯定對象被存儲在HashTable相似的結構中的位置。默認的,Object類的hashCode()方法返回這個對象存儲的內存地址的編號。java

equals():

簡單的說就是判斷兩個對象是不是相同的。相似於"==";web

重寫 hashcode() 和 equals();

在咱們日常的使用中,通常沒必要要重寫這兩個方法,只有咱們須要比較兩個類是否同樣的時候,會用到。 讓咱們來看看下面這個例子 先建個類,Country.javaapi

package org.arpit.javapostsforlearning;

public class Country {

    String name;  
    long population;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public long getPopulation() {  
        return population;  
    }  
    public void setPopulation(long population) {  
        this.population = population;  
    }

}

這個類有兩個基本屬性,name 和 population. 再創建一個類,EqualityCheckMain.javaide

package org.arpit.javapostsforlearning;

public class EqualityCheckMain {

    /** 
     * @author arpit mandliya 
     */  
    public static void main(String[] args) {

        Country india1=new Country();  
        india1.setName("India");  
        Country india2=new Country();  
        india2.setName("India");  
        System.out.println("Is india1 is equal to india2:" +india1.equals(india2));  
    }

}

運行看下結果: [task]Is india1 is equal to india2:false [/task]post

額,這應該不是咱們想要的。咱們給 Country 設置了相同的名稱。爲何會返回fasle呢? 這是由於 india1 和 india2 分配了不一樣的內存地址。咱們這裏能夠經過重寫 equals()方法來得到咱們想要的結果:this

@Override  
    public boolean equals(Object obj) {  
        if (this == obj)  
            return true;  
        if (obj == null)  
            return false;  
        if (getClass() != obj.getClass())  
            return false;  
        Country other = (Country) obj;  
        if (name == null) {  
            if (other.name != null)  
                return false;  
        } else if (!name.equals(other.name))  
            return false;  
        return true;  
    }

如今在運行 EqualityCheckMain.java 一次。看看結果url

[task]Is india1 is equal to india2:true [/task]code

當咱們重寫 equals()以後,就返回 true了。這裏比較了兩個內存地址的name 是否相同。htm

把 Country 對方放入 HashMap:

新建一個類

package org.arpit.javapostsforlearning;

import java.util.HashMap;  
import java.util.Iterator;

public class HashMapEqualityCheckMain {

    /** 
     * @author Arpit Mandliya 
     */  
    public static void main(String[] args) {  
        HashMap<Country,String> countryCapitalMap=new HashMap<Country,String>();   
        Country india1=new Country();  
        india1.setName("India");  
        Country india2=new Country();  
        india2.setName("India");

        countryCapitalMap.put(india1, "Delhi");  
        countryCapitalMap.put(india2, "Delhi");

        Iterator<Country> countryCapitalIter=countryCapitalMap.keySet().iterator();  
        while(countryCapitalIter.hasNext())  
        {  
            Country countryObj=countryCapitalIter.next();  
            String capital=countryCapitalMap.get(countryObj);  
            System.out.println("Capital of "+ countryObj.getName()+"----"+capital);

        }  
    }   
}

運行一下。你將會看到: [task]Capital of India----Delhi
Capital of India----Delhi [/task]

你會發現,key裝入了兩個相同的對象。但在hashmap中,key應該是惟一的。這裏就是由於這兩個對象所分配的內存地址是不一樣的,hashcode也就不一樣了。 咱們須要重寫下這個 hashcode 這個方法:

@Override  
    public int hashCode() {  
        final int prime = 31;  
        int result = 1;  
        result = prime * result + ((name == null) ? 0 : name.hashCode());  
        return result;  
    }

運行看下結果:

[task]Capital of India----Delhi [/task]

如今 hashcode 返回的 india1 和 india2 是同樣的了。如今 equals 方法是用 hashcode 返回值來判斷是否相等的了。這也就是在 java 文檔中提交的:當你重寫 equals() 方法的時候,也必需要重寫 hashcode() 方法。

關鍵記憶了

  1. 若是你重寫 equals 方法你必須重寫 hashcode 方法。
  2. 比較兩個對象是否相同,就是比較 他們是否有相同的hashcode
  3. 兩個hashcode 相同的對象,不必定是相同的。好比 hashCode();都返回空。並不表示兩個對象相等;
  4. 咱們常常比較對象的時候,比較他們的1個屬性。好比上面的 name;

英文原文:[weblink url="http://javapostsforlearning.blogspot.in/2014/02/hashcode-and-equals-method-in-java.html"]hashcode() and equals() method in java[/weblink]

相關文章
相關標籤/搜索