java - LinkedHashMap的Java实现

标签 java linkedhashmap

我无法理解 LinkedHashMapHashFunction 的使用。

在HashMap实现中,hashFunction的使用是为了找到内部数组的索引,这是合理的,遵循hashfunction契约(相同key 必须具有相同的 hashcode,但不同的 key 可以具有相同的 hashcode)。

我的问题是:

1)LinkedHashMap中的hashfunction有什么用?

2) LinkedHashMap 的 put 和 get 方法如何工作?

3)为什么它在内部维护双向链表? 使用HashMap作为内部实现(就像HashSet)并维护Entry索引的单独Array/List有什么问题数组按插入顺序排列?

感谢有用的回复和引用。

最佳答案

1) LinkedHashMap 扩展了 HashMap,因此哈希函数与 HashMap 相同(如果您检查代码,哈希函数是从 HashMap 继承的),即该函数计算插入的对象的哈希并用于存储在数据中结构与具有相同 key 哈希的元素一起; hasfunction 在 get 方法中使用指定为参数的键来检索对象。

2)Put 和 Get 方法的行为方式与 HashMap 相同,加上跟踪元素的插入顺序,因此当您迭代键集时,您会按照插入到映射中的顺序获取键值(请参阅 here更多详情)

3)LinkedHashMap使用双链表而不是数组,因为它更紧凑;双链表是插入和删除项目的列表最有效的数据结构;如果您主要插入/追加元素,那么基于数组的实现可能会更好。由于映射语义是一个键值实现,并且从映射中删除元素可能是一个频繁的操作,因此双链表更适合。内部实现可以使用 LinkedList 来完成,但我的观点是使用低级数据结构更有效,并将 LinkedHashMap 与其他类解耦。

关于java - LinkedHashMap的Java实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29642805/

相关文章:

java - 如何在 Java 9 中将 jar 添加到引导类路径

java - Java foreach 循环中的 ClassCastException

java - 将 linkedHashMap 值与 Java 中的字符串进行比较

java - Java 中的 HashMap 和 Lists 协调

java - synchronizedMap 线程的这种用法安全吗?

java - 如何减少查找数字阶乘的最后一个非零数字的运行时间?

java - Spring事务管理器和DataSource Java配置方式传递相同的bean id而不创建新实例

java - 未能完成 Gradle 执行原因 : org. gradle.internal.nativeintegration.console.ConsoleMetaData

java - 反序列化为使用 Gson 扩展 LinkedHashMap 的类

java - 访问 LinkedHashMap 中最后一个对象中的方法