HashMap没有添加所有键

时间:2017-03-30 09:23:08

标签: java hashmap

我正在向HashMap<String, ChartSeries>添加字符串,但它不会添加所有字符串。但它确实改变了hashmap的大小整数: enter image description here

正如你所看到的那样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());
}

我错过了什么吗?

3 个答案:

答案 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(持有整个条目树)。