1

From JLS:

Whenever it is invoked on the same object more than once during an execution of an application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.

What is meant by the term application here and why the hashcode() for on object is allowed to vary between different execution of the same application ?

4

6 に答える 6

5

アプリケーションはJavaプログラムです。

Objectデフォルト(のハッシュコード)はオブジェクトのアドレスに基づいているため、アプリケーションインスタンスによって異なる場合があります。

于 2012-07-18T07:44:04.443 に答える
2

ここでのアプリケーションという用語の意味

見た目はシンプルですが、ここにはトリックはありません。

同じアプリケーションの異なる実行間で hashcode() を変更できるのはなぜですか?

ハッシュ コレクションはメモリ内にのみ存在し、アプリケーションの再起動時に再構築されます。これは、ビルドするたびに異なる実装を持つことができることを意味します。(既存のコレクションは変更できません)

于 2012-07-18T07:48:28.647 に答える
1

例:

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()中に複数回呼び出された場合でも同じ整数を返します。

これは、ステートメントの意味です。

アプリケーションの実行中に同じオブジェクトで複数回呼び出される場合は常に、オブジェクトのequals比較で使用される情報が変更されていない限り、hashCodeメソッドは一貫して同じ整数を返す必要があります。

今、あなたが言うことでプログラムを再び実行するとき

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

ここで、 emp.hashcode();メソッドは前の整数と同じ整数を返す場合と返さない場合がありhashcode()ます(メソッドの実装によって異なります)。

これは、残りのステートメントが意味するものです。

この整数は、アプリケーションのある実行から同じアプリケーションの別の実行まで一貫している必要はありません。

于 2012-07-18T08:14:43.477 に答える
1

hashCode メソッドは、さまざまな Java クラスで使用されます。たとえば、HashMapは hashCode を使用して、キーを効率的に格納および取得します。

信頼できる結果を得るために、hashCode のコントラクトはそのまま記述されています。たとえば、HashMap で使用されるオブジェクトの hashCode がアプリケーションの実行中に同じでなかった場合、HashMap は一貫してキーを取得できません。

したがって、ここでのアプリケーションとは、Java プログラムの実行中のインスタンスを意味します。プログラムが停止され、再び開始された場合、hashCode が異なる値を返す場合は問題ありません。

于 2012-07-18T07:50:41.443 に答える
0

アプリケーションとは、Java プログラムを意味します。ハッシュコードは、プログラムの異なるインスタンス間で異なる場合がありますが、同じインスタンス内では異なります。

詳しくはhashCodeこちら

于 2012-07-18T07:47:25.440 に答える
0

hashcode() の目的は、オブジェクトのハッシュコードを作成して、ハッシュ セットやハッシュ マップなどに格納できるようにすることです。 hashcode() の目的は、異なるオブジェクトを比較することではありません(それが equals() の目的です)。

hashcode() が JVM の複数回の実行で常に同じ結果を生成する必要はまったくありません。ほとんどの Java オブジェクトは、インスタンスの同じ状態に対して常に同じハッシュコードを返しますが、それに依存するべきではありません。

equals()クラスでオーバーライドする場合は、 もオーバーライドする必要があることにも注意してくださいhashcode()

通常、このメソッドがオーバーライドされるときは常に、hashCode メソッドをオーバーライドする必要があることに注意してください。これは、等しいオブジェクトには等しいハッシュ コードが必要であるという、hashCode メソッドの一般的な契約を維持するためです。

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

于 2012-07-18T07:56:06.380 に答える