HashMap有后备数组,那为什么它是无序的

时间:2017-08-02 15:27:57

标签: java arrays collections hashmap

我读到HashMap有一个支持数组,其中存储了条目(用桶号标记,初始大小为16)。数组是有序的,我可以调用get(n)来获取第n个位置的元素。那么为什么HashMap无序并且没有get(n)方法?

2 个答案:

答案 0 :(得分:5)

这取决于您对订购的含义的看法。

确实HashMaps内部使用的数组或其他具有固定排序的集合。但是,订单的与插入订单或类似的东西有关。元素是有序的,例如,它们的哈希值的大小越来越大,它们与元素本身的一些实际排序无关。

如果您认为HashMap是关键元素的哈希值,那么get(n)确实有n方法。该方法称为get(*key*),它首先计算给定key-element的 hash-value ,然后使用get(*hash-value*)在内部结构上查找值。

这是一个快速搜索结果的图像,显​​示HashSet s的结构:

HashSet structure

请注意HashSetHashMaps有点相同,它们使用相同的技术并应用相同的图像。但是,映射不是仅插入元素,而是插入由键标识的容器,并另外保存一个值。

就像一个小概述。哈希函数是一种函数,它使用其属性为对象计算一个较小的值,哈希值。计算通常可以快速完成,因此在哈希值给定的位置对内部数组的查找也很快。

对于您的具体问题,作为HashMap的用户,您通常不会对哈希值12等具体隐藏的元素感兴趣,这就是为什么他们没有包括这样的方法。但是,如果您真的需要为特殊应用程序执行此操作,或者总是尝试使用反射来访问HashMap的内部,或者您也可以只编写一个小包装器提供这种方法的类。

答案 1 :(得分:2)

A HashMap分为单个存储桶。存储桶最初由数组支持,但是如果存储桶变得太大,则它们将转换为基于哈希码排序的树结构。仅这一事实就会破坏它在保存插入顺序方面可以做出的任何保证。

如果您想了解有关其实施方式的更多信息,可以my answer查看此问题:HashMap Java 8 implementation