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我使用这些数据填充图表,但它没有显示任何内容。我进行了调试,找不到所有对象,所以我问了这个问题。我知道哈希映射是如何工作的,但我认为字符串有一个唯一的哈希。