为什么我们在LinkedHashMap中需要hashcode和bucket概念

Aru*_*wda 4 java collections linkedhashmap data-structures java-8

最近,我一直在进行Map接口的实现java.我理解HashMap,一切都有道理.但是,当涉及到LinkedHashMap,按我所知,到目前为止,该项目有key,value,beforeafter.之前和之后跟踪插入顺序.

然而,使用hashcode和桶概念对我来说没有意义LinkedHashMaps.

我阅读了本文以了解linkedHashMaps的实现

有人可以解释一下吗?

Era*_*ran 6

LinkedHashMap仍然是一种类型HashMap.它采用相同的逻辑HashMap,以便找到其中键所属的水桶(在方法如使用get(),put(),containsKey()等...).将hashCode()被用于定位桶.这种逻辑对于O(1)这些操作的预期性能至关重要.

的附加功能LinkedHashMap(它使用beforeafter参考文献)仅用于根据插入顺序进行迭代的条目,所以它影响的迭代器Collection通过传回的keySet(),entrySet()values()方法.它不会影响条目的存储位置.

如果没有哈希码和存储桶,LinkedHashMap将无法MapO(1)预期的时间内查找密钥.

  • @ArunGowdru是的.虽然诸如`put()`和`remove()`之类的方法在LinkedHashMap中也有一些差异 - 但它们包含了更新`before`和`after`引用值的附加逻辑. (2认同)
  • @ArunGowdru在Java 8中,`LinkedHashMap`甚至不会覆盖`put`或`contains`方法,而只是使用继承的方法.这是因为`HashMap`被设计为可以扩展为`LinkedHashMap`,即所有节点都是通过[(package-private)可覆盖的工厂方法创建的](http://grepcode.com/file/repository.grepcode.com/ java/root/jdk/openjdk/8u40-b25/java/util/HashMap.java#1724)它还调用[专用回调方法](http://grepcode.com/file/repository.grepcode.com/java/根/ JDK /的openjdk/8u40-B25/JAVA/util的/ HashMap.java#1764). (2认同)