從JLS:可有一個人請解釋一下應用程序實際上意味着這個hashCode()方法的合同?
每當它是一個應用程序的執行 在同一對象不止一次上調用,hashCode方法必須一致地返回 相同的整數,沒有設置中使用的信息等於所述比較 對象被修改。該整數不必從一個應用程序的一個執行 保持一致,以同一應用程序的另一執行。
什麼是這裏的長期應用和意思,爲什麼hashcode()
的對象上允許不同的執行相同的應用程序之間有什麼不同?
從JLS:可有一個人請解釋一下應用程序實際上意味着這個hashCode()方法的合同?
每當它是一個應用程序的執行 在同一對象不止一次上調用,hashCode方法必須一致地返回 相同的整數,沒有設置中使用的信息等於所述比較 對象被修改。該整數不必從一個應用程序的一個執行 保持一致,以同一應用程序的另一執行。
什麼是這裏的長期應用和意思,爲什麼hashcode()
的對象上允許不同的執行相同的應用程序之間有什麼不同?
Application是你的Java程序。
它可以從不同的應用程序實例中變化,因爲它是通過缺省基於所述對象的地址(的Object
哈希碼)。
什麼是這裏的長期應用意味着
它因爲它的聲音,沒那麼簡單技巧在這裏。
爲什麼hashcode()允許在同一應用程序的不同執行之間變化?
散列集合僅在內存中,並在應用程序重新啓動時重新構建。這意味着它每次構建時都可以有不同的實現。 (對於現有集合,不能更改)
hashCode方法由各種java類使用。例如,HashMap使用hashCode來有效地存儲和檢索密鑰。
爲了給可靠的結果的hashCode合同上載明的。例如。如果在應用程序運行期間HashMap中使用的對象的hashCode不相同,則HashMap將無法持續檢索該鍵。
所以這裏的應用程序意味着你的java程序的運行實例。如果程序停止並重新啓動,那麼hashCode會返回不同的值。
哈希碼的目的()是創建一個對象的哈希代碼,因此它可以被存儲在哈希集合,哈希映射等 哈希碼(的目的)是不比較不同的對象(這就是最新的equals ()是)。
對於幾次運行JVM時,hashcode()並不總是產生相同的結果。儘管大多數java對象總是返回相同的哈希碼,但是它們不應該依賴它。
您還應該注意,如果您在課程中覆蓋equals()
,則還應該覆蓋hashcode()
。
注意,這是通常需要覆蓋每當這個方法被覆蓋,以便維持對hashCode方法,其中指出,等於對象必須具有相等的散列碼的一般合同hashCode方法。
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
通過一個例子:
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()
方法實現)。
這是其餘的聲明意味着什麼:
該整數不必從 應用程序的一個執行保持一致,以同一應用程序的另一執行。