これは、ハッシュコードが同じでキーが異なる 2 つのアイテムが同じバケットに入ることを意味します。
あなたの場合、キー「two」は同じであるため、2番目の put は最初のものを上書きします。
ただし、独自のクラスがあると仮定すると
class Thingy {
private final String name;
public Thingy(String name) {
this.name = name;
}
public boolean equals(Object o) {
...
}
public int hashcode() {
//not the worlds best idea
return 1;
}
}
そしてそれの複数のインスタンスを作成しました。すなわち
Thingy a = new Thingy("a");
Thingy b = new Thingy("b");
Thingy c = new Thingy("c");
そして、それらをマップに挿入しました。次に、1 つのバケット、つまりハッシュコード 1 の要素を含むバケットには、3 つのアイテムのリスト (チェーン) が含まれます。
Map<Thingy, Thingy> map = new HashMap<Thingy, Thingy>();
map.put(a, a);
map.put(b, b);
map.put(c, c);
そのため、Thingy キーでアイテムを取得すると、ハッシュコード O(1) のルックアップに続いて、ハッシュコード 1 のバケット内のアイテムのリストで線形検索 O(n) が行われます。
また、hashcode と equals を実装するときは、正しい関係に従うように注意してください。つまり、2 つのオブジェクトが等しい場合、それらは同じハッシュコードを持っている必要がありますが、複数のキーが同じハッシュコードを取得する可能性があるため、必ずしもそうであるとは限りません。
ああ、オープンハッシュとクローズドハッシュテーブルの完全な定義については、http://www.c2.com/cgi/wiki? HashTable を参照してください。