2012-03-22 7 views
2

hashCodeとequals()を正しく実装した場合、次のコードはfalseを返すことができますか?javaハッシュテーブルに奇妙さが含まれています

myLinkedHashMap.containsKey(myLinkedHashMap.keySet().iterator().next()) 
+0

「決定論的」とは「正しい」という意味ですか? –

+0

これは同じオブジェクトなので、この場合は関係ありません。したがって、同じオブジェクト上の2つの呼び出しが同じhashCodeを生成する限り、trueを返します。しかし、はい、それはまた正しいです。 –

+1

しかし、 "決定論的"は、 "同じオブジェクト上の2つの呼び出しが同じhashCodeを生成する"という意味ではありません。 'ArrayList .hashCode'については何も*非決定論的ではありませんが、私の答えを見てください... –

答えて

7

ほとんどのシナリオはhashCodeは「決定論的」であってもなり、それが変更可能なフィールドに基づくことができます。 の計算に使用したフィールドをMapに入れた後に変更すると、それ以上見つけられなくなります。

編集:「通常」もうそれを見つけることができませんあなたを明確にすべきです。 2つの数字が同じバケットに再ハッシュされる可能性があるため、時にはまだ動作します。これは、もちろん、起こるときだけ混乱に加わる!

+0

うん、突然変異。ありがとう。 –

2

それはそれはハッシュマップに挿入されていた後、あなたは「決定論」が、キーに任意のハッシュ変える突然変異によって何を意味するかは明らかではありません簡単にその効果を持つことができます。

import java.util.*; 

public class Test { 
    public static void main(String[] args) { 
    List<String> strings = new ArrayList<String>(); 
    Map<List<String>, String> map = new LinkedHashMap<List<String>, String>(); 

    map.put(strings, ""); 
    System.out.println(map.containsKey(map.keySet().iterator().next())); // true 
    strings.add("Foo"); 
    System.out.println(map.containsKey(map.keySet().iterator().next())); // false 
    } 
} 

ArrayList<T>のハッシュコードは、決定論的であるが、それは、リストの内容が変更ならば、それは変化しないという意味ではありません。

1

あなたhashCodeequalsが相互に同意しない場合、これはfalseを返すことができます。たとえば、equalsメソッドが常にfalseを返した場合は、マップ内のキーと同等のオブジェクトがないため、falseが返されます。

希望すると便利です。私は考えることができる

2
  1. hashCode()可変あるインスタンスの属性に基づいており、それらの属性は、挿入後に変更された場合、反復中hashCode()コールは別の何かを返します。 equals()はこれらの同じ属性に基づいている必要がありますが、失敗することも予想されます。別のスレッドが反復の途中でMapからすべてのアイテムを削除した場合

  2. next()もはや存在しないであろう。

私はあなたのオブジェクトそのものだろう、キーとしてhashCode()値を使用していないだろう。

+0

スレッドがありません。 –

+1

あなたが考えている特定のインスタンスが1つのスレッドではなく、1つのスレッドしか使用していない場合は**問題**が発生する可能性があります。 –

0

まず、hasNext()をチェックします。

+0

いいえ、そこにあります。間違いなく要素がある。 –

3

私が見てきたすべてのハッシュアルゴリズムは、その中に入力値の特定のセットのために、あなたは同じハッシュ値を取得し、「決定論」です。ハッシュコードは、オブジェクトの変更可能なプロパティに基づいて計算されている場合は、それらの可変のいずれかのプロパティが変更された場合、それはハッシュマップにだ後

、ハッシュコードが変更されます。

0

あなたは最初のキーを取得してのcontainsKeyの呼び出しの間に別のスレッドの最初のキーを削除することができます。