使用带有自定义内部类的Hashmap的问题

时间:2011-07-22 17:13:48

标签: java hashmap

我的代码如下所示:

private void MethodToDo(SpecialObject o) {
    Map<InfoObj, Integer> totalNeeds = new HashMap<InfoObj, Integer>();

    for (ListObject obj : o.getListOfObjects()) {
        InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId());
        Integer need = totalNeeds.get(infoObj);

        if (need == null) {
           need = new Integer(obj.getNeeded());
        } else {
           need = need + obj.getNeeded();
        }
        totalNeeds.put(infoObj, need); 
    }
}

该对象是一个私有内部类(与该方法在同一个类中),如下所示:

private class InfoObj {
    private String  title;
    private Integer id;

    public InfoObj(String title, Integer id) {
        this.title = title;
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public Integer getId() {
        return id;
    }

    @Override 
    public boolean equals(Object io2) {
        if (this == io2) { return true; }
        if ( !(io2 instanceof InfoObj) ) { return false; }
        InfoObj temp = (InfoObj) io2;
        return this.id.equals(temp.id) && this.title.equals(temp.title);
    }

    @Override
    public int hashCode() {
        final int prime = 7;
        int result = 1;
        result = prime * result
                + ((this.title == null) ? 0 : this.title.hashCode());
        result = prime * result
                + ((this.id == null) ? 0 : this.id.hashCode());
        return result;
    }

然而,尽管覆盖了equals和hashCode方法,hashMap仍将包含重复键(因为title和id是等效的......但仍然显示在多个位置)。我想我正在做的一切都正确,但意识到我可能会遗漏一些东西......

另外,我知道有重复键,因为我遍历keySet并输出结果,这导致具有相同标题和id的对象多次显示。

2 个答案:

答案 0 :(得分:0)

看起来这里的一切都很好。

答案 1 :(得分:0)

根据您的评论,HashMap不能包含与实现相同密钥的相同密钥:

(e.hash == hash && ((k = e.key) == key || key.equals(k)))

由于您正在遵循equals和hashcode的合约,因此您在此处创建了任何对象:

InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId());

使用相同的ID和标题,将被视为相同的key,如果地图以前包含该键的映射,则替换旧值。