大家好我正在使用HashMap用字符串键来保存我的一个对象。当我用一个键放置一个对象时它没有问题,当我放入我的第二个对象时,我添加了我的对象但是无法用它的键获取它。它有点像“下一个”。我从调试模式(eclipse)下面截取了
虽然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;
}
答案 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
),但也许这只是初学者代码,你的真实用例是不同的。