从HashMap获取价值的问题

时间:2011-09-21 18:08:19

标签: java collections hashmap

大家好我正在使用HashMap用字符串键来保存我的一个对象。当我用一个键放置一个对象时它没有问题,当我放入我的第二个对象时,我添加了我的对象但是无法用它的键获取它。它有点像“下一个”。我从调试模式(eclipse)下面截取了

enter image description here

虽然size显示为2,但我看不到我在hashmap中的第二项,而是在其他hashmap的下一个节点中。

要注意我使用我的密钥的方式,例如“name.tag”形式,同时标签和名称可能永远不会相同,但“tag”可以是相同的。在评估密钥时,hashmap是否与点运算符有关?我希望我能写清楚,

提前致谢

编辑: 这是我用来创建我的hashmap的一段代码

        private HashMap<String,ParameterItem> parseParametersNode(DataModel parent,Element element){
        NodeList parameterChilds=element.getChildNodes();//gep element parameters
        HashMap<String, ParameterItem> parameterItems=new HashMap<String, ParameterItem>();
        for(int i=0;i<parameterChilds.getLength();i++){
            if(parameterChilds.item(i).getNodeType()==Node.ELEMENT_NODE){
                Element el=(Element) parameterChilds.item(i);
                NamedNodeMap atts=el.getAttributes();
                ParameterItem item=new ParameterItem();

                for(int j=0;j<atts.getLength();j++){
                    Attr attribute=(Attr) atts.item(j);
                    String attributeValue=attribute.getValue();
                    String attributeName=attribute.getName();
                    item.setParsedProperty(attributeName, attributeValue);
            } /*check  attributes later*/
                //finish loop and insert paramitem to params
                String key="key"+i;
                if(item.getTag()!=null && item.getName()!=null)
                    key=item.getName()+"."+item.getTag();
                parameterItems.put(key, item);
//              testParam=item;
//              parameterItems.put(key, testParam);
                }
        }
        return parameterItems;

    }

2 个答案:

答案 0 :(得分:2)

你有代码:

String key="key"+i;

但在此之后你再次设置密钥而不是添加它:

if(item.getTag()!=null && item.getName()!=null)
              key=item.getName()+"."+item.getTag();

这应该是键+ = item.getName()+“。”+ item.getTag(); ?

答案 1 :(得分:2)

这里没有问题:你有一个hash collision。也就是说,您的两个密钥都放在同一个哈希桶中。看起来你只有四个桶(奇怪,我认为初始默认值是10或16),所以随机数据的可能性是25%。你的尺寸增加得很好。 next是内部实现指向同一存储桶中的下一个元素的方式。如果每个桶中的元素数量太大,Java将在内部重新散列到更多桶中。

我不明白为什么你需要一个HashTable,因为你连续编号你的密钥(你可以使用ArrayList),但也许这只是初学者代码,你的真实用例是不同的。