Java 为什么我的HashMap将元素放在位置6而不是下一个空位置?

Java 为什么我的HashMap将元素放在位置6而不是下一个空位置?,java,hashmap,Java,Hashmap,我在一个方法中运行下面的代码,但是在返回键和值时,它们位于映射的第六个位置,而不是它应该位于的第一个位置。这是怎么回事 我创建这个映射以作为参数发送到Jasper报告,它将dataInicio放在第六位,然后将dataFim放在第一位,将ListaParametos放在第三位。这太疯狂了 代码如下: final Map<String, Object> parameters = new HashMap<String, Object>(); paramete

我在一个方法中运行下面的代码,但是在返回键和值时,它们位于映射的第六个位置,而不是它应该位于的第一个位置。这是怎么回事

我创建这个映射以作为参数发送到Jasper报告,它将dataInicio放在第六位,然后将dataFim放在第一位,将ListaParametos放在第三位。这太疯狂了

代码如下:

 final Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("SUBREPORT_DIR", "apple");
        parameters.put("dataInicio", "orange");
        parameters.put("dataFim", "melon");
        parameters.put("listaParametros", "banana");
        return parameters;
final Map parameters=new HashMap();
参数put(“子报告_DIR”、“苹果”);
参数。put(“dataInicio”、“orange”);
参数。put(“数据FIM”、“瓜”);
参数put(“listaParametros”、“香蕉”);
返回参数;

下面是Expressions视图的eclipse打印屏幕:

哈希映射不是列表,索引使用哈希函数计算,具体取决于存储的数据。事实上,有时不同的数据会得到相同的索引,当这种情况发生时,哈希映射有一种机制可以为其中一个数据分配不同的索引。

哈希映射不是列表,而是根据存储的数据使用哈希函数计算索引。事实上,有时不同的数据会得到相同的索引,当这种情况发生时,哈希映射有一种机制可以为其中一个数据分配不同的索引。

这就是
哈希映射的要点。事实上,它就是“散列”这个词的意思。元素应该放在表中基本上是随机的位置——在许多情况下,散列码会调整表的大小


这就是为什么
HashMap
的文档声明“此类不保证映射的顺序;特别是,它不保证随着时间的推移顺序保持不变。”

这就是
HashMap
的全部要点。事实上,它就是“散列”这个词的意思。元素应该放在表中基本上是随机的位置——在许多情况下,散列码会调整表的大小



这就是为什么
HashMap
的文档声明“此类不保证映射的顺序;特别是,它不保证随着时间的推移顺序保持不变。”

因为这就是
HashMap
的工作原理-键根据其哈希代码插入到桶中,插入顺序不保留。您可能希望尝试
字符串、对象对列表或
LinkedHashMap
(这不会改变任何有关内部存储的内容,但至少能够按插入顺序返回值).

因为这就是HashMap的工作原理-键是根据它们的hash代码插入到bucket中的,插入顺序不会保留。您可能希望尝试使用
字符串、对象对列表或
LinkedHashMap
(这不会改变任何有关内部存储的内容,但至少能够按插入顺序返回值)。

因为HashMap就是这样工作的-键根据其哈希代码插入到存储桶中,插入顺序不保留。您可能想尝试一个
字符串、对象
对的列表。为什么它应该位于位置1?其他人告诉过您关于
HashMap
,但是还有其他
Map
实现(例如
TreeMap
ConcurrentSkipListMap
)因为HashMap就是这样工作的——键是根据它们的哈希代码插入到bucket中的,所以插入的顺序不会被保留。您可能想尝试一个
字符串、对象
对的列表。为什么它应该位于位置1?其他人告诉过您关于
HashMap
,但是还有其他
Map
实现(例如
TreeMap
ConcurrentSkipListMap
)按照我的理解,我必须按照我在代码中声明的顺序设置报表参数。我使用了LinkedHashMap,但正如您所指出的,它不会改变它的内部存储,因此我得到了相同的错误,因为映射中元素的顺序与报告中声明的顺序不同。有什么想法吗?@StudioWorks:你到底犯了什么错误?或者:你后来是如何读取这些值的?我猜出来了。在我的评论里。谢谢你的帮助。据我所知,我必须按照我在代码中声明的顺序设置报表参数。我使用了LinkedHashMap,但正如您所指出的,它不会改变它的内部存储,因此我得到了相同的错误,因为映射中元素的顺序与报告中声明的顺序不同。有什么想法吗?@StudioWorks:你到底犯了什么错误?或者:你后来是如何读取这些值的?我猜出来了。在我的评论里。感谢您的帮助。如果您使用
LinkedHashMap
,您可以保留插入顺序,但备份存储仍然是一个哈希表,因此您的数据将以这种令人讨厌的方式重新排列。好消息是,您可以按可预测的顺序将其取回。@ChristopherSchultz我应该按照报表参数在映射中的排列顺序来定义报表参数,因此,如果报表参数包含元素、空桶,然后在第六个位置包含我需要的元素,我认为它不会工作。不,LinkedHashMap应该处理这个问题。无法通过API在外部观察bucket排序,只能通过调试器查看。LHM将起作用。@StudioWorks JasperReports不关心参数的顺序,因为它们是在
映射中命名的。不要担心订单;JasperReports会做正确的事情。说“随机位置”是描述真正目标的一种弱方法,即任何给定的密钥集都应均匀分布到存储桶。如果使用
LinkedHashMap
,则可以保留插入