2012-07-18 12 views
1

從JLS:可有一個人請解釋一下應用程序實際上意味着這個hashCode()方法的合同?

每當它是一個應用程序的執行 在同一對象不止一次上調用,hashCode方法必須一致地返回 相同的整數,沒有設置中使用的信息等於所述比較 對象被修改。該整數不必從一個應用程序的一個執行 保持一致,以同一應用程序的另一執行。

什麼是這裏的長期應用和意思,爲什麼hashcode()的對象上允許不同的執行相同的應用程序之間有什麼不同?

回答

5

Application是你的Java程序。

它可以從不同的應用程序實例中變化,因爲它是通過缺省基於所述對象的地址(的Object哈希碼)。

2

什麼是這裏的長期應用意味着

它因爲它的聲音,沒那麼簡單技巧在這裏。

爲什麼hashcode()允許在同一應用程序的不同執行之間變化?

散列集合僅在內存中,並在應用程序重新啓動時重新構建。這意味着它每次構建時都可以有不同的實現。 (對於現有集合,不能更改)

1

hashCode方法由各種java類使用。例如,HashMap使用hashCode來有效地存儲和檢索密鑰。

爲了給可靠的結果的hashCode合同上載明的。例如。如果在應用程序運行期間HashMap中使用的對象的hashCode不相同,則HashMap將無法持續檢索該鍵。

所以這裏的應用程序意味着你的java程序的運行實例。如果程序停止並重新啓動,那麼hashCode會返回不同的值。

0

哈希碼的目的()是創建一個對象的哈希代碼,因此它可以被存儲在哈希集合,哈希映射等 哈希碼(的目的)是比較不同的對象(這就是最新的equals ()是)。

對於幾次運行JVM時,hashcode()並不總是產生相同的結果。儘管大多數java對象總是返回相同的哈希碼,但是它們不應該依賴它。

您還應該注意,如果您在課程中覆蓋equals(),則還應該覆蓋hashcode()

注意,這是通常需要覆蓋每當這個方法被覆蓋,以便維持對hashCode方法,其中指出,等於對象必須具有相等的散列碼的一般合同hashCode方法。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object

0

通過一個例子:

class Employee{ 
public int id; 
public String name; 

public Employee(int id,String name){ 
this.id=id; 
this.name=name; 
} 

public boolean equals(Employee employee){ 

return (this.id==emplooyee.id && this.name.equals(employee.name)) 

} 

public hashcode(){ 

return id+name.hashcode(); 

} 

現在假設以下在由main函數被稱爲一些其它類的代碼;

Employee emp = new Employee(1, "Sam"); 
emp.hashcode(); 
//some other code with does not modify the contents of `emp` 
emp.hashcode(); 

這些調用emp.hashcode()方法將返回即使相同的執行期間多次調用相同的整數。

這就是由語句的意思是:

只要它是一個 執行應用程序的過程在同一對象上多次調用,hashCode方法必須始終 返回相同的整數,前提沒有使用等於 對象的對象被修改。

現在,當你再次運行程序說

Employee emp = new Employee(1, "Sam"); 

這裏emp.hashcode();方法可能會或可能不會返回相同的整數爲前一(取決於hashcode()方法實現)。

這是其餘的聲明意味着什麼:

該整數不必從 應用程序的一個執行保持一致,以同一應用程序的另一執行。

相關問題