Java HashMap未添加所有键

Java HashMap未添加所有键,java,hashmap,Java,Hashmap,我正在将字符串添加到HashMap中,但它没有添加所有字符串。但是,它会更改hashmap的大小整数: 如您所见,它显示的是size:6,但当您查看该表时,它只包含4个对象 这是我的代码: for (CaseTypeActivationAmount CTAM : caseTypeActivationAmounts) { ChartSeries cs; if (!caseTypes.containsKey(CTAM.getOmschrijving())) { if

我正在将字符串添加到
HashMap
中,但它没有添加所有字符串。但是,它会更改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());
}

我错过什么了吗

是的,你遗漏了什么。
HashMap
的支持数组的每个位置都可以保存对单个
HashMap.Node
的引用。但是,该
节点
不一定只包含一个
映射项
。它可以包含一个链表或条目树,这些条目映射到
HashMap
的同一个bucket(位)

因此,您看到的4个
节点与4个条目不对应


如果您在映射的
入口集
上迭代,您将看到所有6个条目。

是的,您缺少了一些内容。
HashMap
的支持数组的每个位置都可以保存对单个
HashMap.Node
的引用。但是,该
节点
不一定只包含一个
映射项
。它可以包含一个链表或条目树,这些条目映射到
HashMap
的同一个bucket(位)

因此,您看到的4个
节点与4个条目不对应

如果您在映射的
入口集
上迭代,您将看到所有6个条目

当您查看表格时,它仅容纳4个对象

这张桌子上有六个物体。然而,由于散列冲突,它只将它们保存在四个文件中

您可以看到调试器中发生了什么:打开每个节点的值,然后检查下一个值。您将发现(1)六个节点中的两个节点有第二个项目,或者(2)六个节点中的一个节点在其链中有两个附加项目,用于六个对象的总体计数

当您查看表格时,它仅容纳4个对象

这张桌子上有六个物体。然而,由于散列冲突,它只将它们保存在四个文件中


您可以看到调试器中发生了什么:打开每个节点的值,然后检查下一个值。您将发现(1)六个节点中的两个节点有第二个项,或者(2)六个节点中的一个节点在其链中有两个附加项,用于六个对象的总体计数。

这些是
节点,实际上是链接节点。一些键的hashcode是相等的,在同一个bucket中可以得到多个条目

您看到的
HashMap$节点之一实际上是:

 HashMap$Node -> HashMap$Node(next)...
下面是它内部的实际外观:

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
静态类节点实现Map.Entry{
最终整数散列;
最终K键;
V值;
Node next;//注意这里的下一个

当你在一个特定的限制之后进入
,这些节点将成为一个bucket中的TreeNodes(包含整个条目树)。

这些是
节点,实际上是LinkedNodes。一些键的hashcode是相等的,并且你在同一个bucket中获得多个条目

您看到的
HashMap$节点之一实际上是:

 HashMap$Node -> HashMap$Node(next)...
下面是它内部的实际外观:

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
静态类节点实现Map.Entry{
最终整数散列;
最终K键;
V值;
Node next;//注意下面的

当您在某个限制之后执行
时,这些节点将成为TreeNodes(包含整个条目树)在一个桶中。

你问的问题完全是基于一个错误的前提。如果你做了任何测试或研究,而不是试图猜测
HashMap
的实现逻辑,你会发现一切都很好。我已经删除了我的否决票。@shmosel我使用这些数据填充图表,但它没有显示任何内容。我进行了调试,找不到所有对象,所以我问了这个问题。我知道Hashmap是如何工作的,但我认为字符串有一个唯一的散列。你问的问题完全是基于一个错误的前提。如果你做了任何测试或研究,而不是试图猜测
Hashmap
的实现逻辑,你会看到ev任何东西都可以正常工作。我已经删除了我的下一票。@shmosel我使用这些数据填充图表,但它没有显示任何内容。我进行了调试,找不到所有对象,所以我问了这个问题。我知道哈希映射是如何工作的,但我认为字符串有一个唯一的哈希。