我正在向HashMap<String, ChartSeries>
添加字符串,但它不会添加所有字符串。但它确实改变了hashmap的大小整数:
正如你所看到的那样size:6
,但当你查看表时,它只能容纳4个物体。
这是我的代码:
for (CaseTypeActivationAmount CTAM : caseTypeActivationAmounts) {
ChartSeries cs;
if (!caseTypes.containsKey(CTAM.getOmschrijving())) {
if (CTAM.getOmschrijving() != null) {
cs = new ChartSeries(CTAM.getOmschrijving());
} else {
cs = new ChartSeries(" ");
}
caseTypes.put(CTAM.getOmschrijving(), cs);
} else {
cs = caseTypes.get(CTAM.getOmschrijving());
}
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
cs.set(dateFormat.format(CTAM.getDate()), CTAM.getAmount());
}
我错过了什么吗?
答案 0 :(得分:3)
当您查看表格时,它只能容纳4个对象。
该表确实包含六个对象。但是,由于哈希冲突,它只将它们保存在四个separate chains中。
您可以看到调试器中发生了什么:打开每个节点的值,然后检查下一个值。你会发现(1)六个节点中的两个有第二个项目,或者(2)六个节点中的一个在其链中有两个额外的项目,总计六个对象。
答案 1 :(得分:1)
是的,你错过了一些东西。 HashMap
的后备数组的每个位置都可以包含对单个HashMap.Node
的引用。但是,Node
不一定只包含一个Map.Entry
。它可以包含链接列表或条目树,它们映射到HashMap
的同一个桶(位)。
因此,您看到的4个Node
与4个条目不对应。
如果您遍历地图的entrySet
,则会看到所有6个参赛作品。
答案 2 :(得分:1)
那些是Node
s,实际上是LinkedNodes。某些键的哈希码是相同的,并且您在同一个桶中获得了多个条目。
您看到的其中一个HashMap$Node
实际上是:
HashMap$Node -> HashMap$Node(next)...
以下是actually
内部的看法:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next; // NOTICE the next here
当您after
达到某个限制时,这些节点将成为一个存储桶中的TreeNodes(持有整个条目树)。