如果Map.Entry是Map.Entry []并且没有在hashMap中列出,会发生什么?我只想了解为什么bucket是list而不是hashmap java中的数组实现。
答案 0 :(得分:2)
我认为你在谈论每个桶条目中的LinkedList
。
让我们说它是一个数组,当你向该存储桶添加一个元素时,你必须创建一个确定大小的数组,比如10,这里你已经为10个条目分配了内存(当然它并不太多)但是该数组中的元素是基于具有相同hashcode()
但不同equals()
的元素添加的。
如果该存储桶中只有2个元素但我们为10保留了空间,那么最终可能会出现稀疏填充的数组。
只要添加具有相同哈希码的元素,您也可以处理这些桶阵列的重新调整大小。当你需要处理重新调整大小时,你通常会维护一个计数器来检查元素的数量是否达到当前的数组大小,创建一个更大的数组,复制所有这些元素,并且你必须在一个{{{ 1}}调用Map :)数组的主要优点是随机访问,但是当你尝试put
数组中的某个元素时,它并不知道哪个元素匹配get
,所以它将遍历该阵列的所有元素,从而失去了数组的优势。
但是如果使用equals()
,则只需继续添加元素,无需创建/重新调整数组大小。另外,如果你注意到,在向LinkedList
添加元素时他们正在做的一件聪明的事情就是他们不会遍历整个列表来查找最后一个元素。他们创建一个新的LinkedList
对象,其下一个元素指向存储在bucket index中的现有元素,并更新存储桶索引以指向这个新元素,这样他们就不必每次都遍历列表你添加一个新元素。所以它在内存和速度方面都有所提升:)
jdk8中的另一个更新是,Entry
实现在达到阈值(8)后更改为LinkedList
。这是为了促进更快的查找,所以不是遍历所有元素到Tree
O(n)(线性)时间中的某个元素,它现在是O(logn)
答案 1 :(得分:1)
嗯,它会更难处理,例如重新调整大小。
如果你看一下List
类的代码,你会发现在基础上,大多数只是Array
,其中的方法可以让开发人员更容易处理数组。
答案 2 :(得分:1)
以下提及的差异有助于您了解为什么不Map.Entry[]
主要考虑因素是 SIZE(第2点) ,但还有其他原因
列表(在这种情况下为链接列表)优于数组:
在以下情况下优先使用数组:
您需要对元素进行索引/随机访问
你提前知道数组中元素的数量 您可以为阵列分配正确的内存量
数组有O(1)随机访问权限,但真的很贵到添加 填充或删除的东西。