2016-07-26 10 views
1

私はhashCodeのアイデアとその必要性を理解しています。しかし、私は、Genericオブジェクトに対してhashCodeがどのように計算されるのか混乱しています。だから私の質問です。私は文字列をしている場合、私はおそらくJavaの汎用オブジェクト用のHashCode

int hash = 7; 
for (int i = 0; i < strlen; i++) { 
    hash = hash*31 + charAt(i); 
} 

、ハッシュコードを計算するには、次の機能を使用しかし、私は次のオブジェクトをしたと言うだろう、

class Node<K, V> { 

     private K key; 
     private V value; 
     private Node<K, V> next; 
} 

私のIDEは、自動化されたハッシュコード関数を生成しますこのため、

@Override 
public int hashCode() { 
     int result = key != null ? key.hashCode() : 0; 
     result = 31 * result + (value != null ? value.hashCode() : 0); 
     result = 31 * result + (next != null ? next.hashCode() : 0); 
     return result; 
} 

私の質問は、キーと値は一般的なものであるため、key.hashCode()は何をするんでしょうか? このメソッドはどのように機能しますか?

+2

'key.hashCode()'は多態性を使用して、 'key 'を実装したクラスに与えた実装を呼び出します。 –

+0

汎用オブジェクトのようなものはありません。ある特定のタイプのオブジェクトを参照するために使うことができるジェネリック*タイプ*があります。すべてのオブジェクトが 'Object'のインスタンスであるため、必ず' hashCode() 'メソッドを持ちます。 – shmosel

答えて

2

KおよびVは、Nodeオブジェクトのパラメータ化されたタイプです。

したがって、hashCodeが実際のタイプで呼び出されます。

例えば、Node<String, Integer>は、それぞれString#hashCodeとが呼び出されます。

カスタムオブジェクト、hashCodeの独自の実装やhashCodeの親の実装のいずれかでそれをパラメータ化している場合は、ネイティブ(すなわち、プラットフォーム依存)の実装である、Object#hashCodeまで、呼び出されます。

+0

もし私がこの権利を持っていれば、StringオブジェクトとIntegerオブジェクトは独自のhashCodeメソッドを持っていて、どのような具体的な型に基づいて呼び出されるのでしょうか? –

+0

@CodeMonkeyはい – alamar

+0

@CodeMonkey **はい**、アラマーが言う通り。 'String'や' Integer'などのソースを探すことができます。 – Mena

0

Javaのデフォルト値はObject.hashCode()です。

Objectによって定義されたhashCodeメソッドは、別個のオブジェクトに対して異なる整数を返します。 (これは、典型的に整数にオブジェクトの内部アドレスを変換することによって実現されるが、この実装技術は、Javaプログラミング言語で必要とされない。)

hashCode()は、K及びVの具象クラスでオーバーライドされた場合、正確なオーバーライドメソッドが呼び出されます。

0

JavaのObjectクラスが(そうではないことが多いから、使用する一つの基準に基づくものとはいえ。).hashCode()メソッドを持っているkey.hashCode()は、このように存在することが保証されて、そして関係なく正確に派遣することはできないものを、このジェネリックの特定のタイプです。それはObjectの '.hashCode() `実装を使用するか、または利用可能であればより具体的な実装を使用します。