5

HashMapBulletinBoardでサービスとサービスリクエストを追跡するためにを使用しています。ただし、重複するキーを取得しているため、ハッシュコードが必要であり、equalsが間違っています。なぜこれが起こるのか誰かにわかりますか?

keySetの内容:

Services: [1, 1, 6, 6, 3]
Requests: [8, 7, 6, 5, 8, 4, 5, 6, 2]

関連するコードは次のとおりです。

private static final HashMap<Advert, Integer> services = new HashMap<>();
...

public class Advert {

private int id;
private BoardPoster poster;

public Advert(BoardPoster poster) {
    this.poster = poster;
}

public BoardPoster getPoster() {
    return poster;
}

public void spawn() {
    id = RANDOM.nextInt(ADVERT_RANGE);
}

public int getID() {
    return id;
}

@Override
public String toString() {
    return Integer.toString(id);
}

@Override
public boolean equals(Object o) {
    if (o != null && o instanceof Advert) {
        return ((Advert) o).id == id;
    }
    return false;
}

@Override
public int hashCode() {
    return 67 * 5 + this.id;
}
}
4

1 に答える 1

18

最も可能性の高い理由は、キーとして使用するオブジェクトが可変であることです。したがって、次のようなことをすると:

map.put(anAdvert, 1);
anAdvert.spawn(); //modifies id, which affects hashcode and equals

マップの動作は予期しないものになります。

cf Map の javadoc

注: 変更可能なオブジェクトをマップ キーとして使用する場合は、細心の注意を払う必要があります。オブジェクトがマップ内のキーであるときに、等値比較に影響を与える方法でオブジェクトの値が変更された場合、マップの動作は指定されません。

于 2012-09-14T14:42:12.043 に答える