我读到HashMap有一个支持数组,其中存储了条目(用桶号标记,初始大小为16)。数组是有序的,我可以调用get(n)来获取第n个位置的元素。那么为什么HashMap无序并且没有get(n)方法?
答案 0 :(得分:5)
这取决于您对订购的含义的看法。
确实HashMaps
内部使用的数组或其他具有固定排序的集合。但是,订单的无与插入订单或类似的东西有关。元素是有序的,例如,它们的哈希值的大小越来越大,它们与元素本身的一些实际排序无关。
如果您认为HashMap
是关键元素的哈希值,那么get(n)
确实有n
方法。该方法称为get(*key*)
,它首先计算给定key-element的 hash-value ,然后使用get(*hash-value*)
在内部结构上查找值。
这是一个快速搜索结果的图像,显示HashSet
s的结构:
请注意HashSet
与HashMaps
有点相同,它们使用相同的技术并应用相同的图像。但是,映射不是仅插入元素,而是插入由键标识的容器,并另外保存一个值。
就像一个小概述。哈希函数是一种函数,它使用其属性为对象计算一个较小的值,哈希值。计算通常可以快速完成,因此在哈希值给定的位置对内部数组的查找也很快。
对于您的具体问题,作为HashMap
的用户,您通常不会对哈希值1
或2
等具体隐藏的元素感兴趣,这就是为什么他们没有包括这样的方法。但是,如果您真的需要为特殊应用程序执行此操作,或者总是尝试使用反射来访问HashMap
的内部,或者您也可以只编写一个小包装器提供这种方法的类。
答案 1 :(得分:2)
A HashMap
分为单个存储桶。存储桶最初由数组支持,但是如果存储桶变得太大,则它们将转换为基于哈希码排序的树结构。仅这一事实就会破坏它在保存插入顺序方面可以做出的任何保证。
如果您想了解有关其实施方式的更多信息,可以my answer查看此问题:HashMap Java 8 implementation